Sun Feb 14 2021 06:54:01 GMT+0700 (Western Indonesia Time)
Nowadays accessing Wi-Fi networks information becomes common in our Desktop, Web, Mobile and IOT applications. Detecting the available or cached Wi-Fi networks information is no more a tough task from your code. MiTec’s System Information Management Suite’s component helps to detect easily the Wi-Fi networks and we will learn how to use TMiTeC_WIFI component in the blog post.
Platforms: Windows.
Installation Steps:
You can easily install this Component Suite from GetIt Package Manager. The steps are as follows.
Navigate In RAD Studio IDE->Tools->GetIt Package Manager->select Components in Categories->Components->Trail -MiTec system Information Component Suite 14.3 and click Install Button.
Read the license and Click Agree All. An Information dialog saying ‘Requires a restart of RAD studio at the end of the process. Do you want to proceed? click yes and continue.
It will download the plugin and installs it. Once installed Click Restart now.
How to run the Demo app:
Navigate to the System Information Management Suite trails setup, Demos folder which is installed during Get It installation e.g) C:UsersDocumentsEmbarcaderoStudio21.0CatalogRepositoryMiTeC-14.3DemosDelphi16
Open the SC project in RAD studio 10.4.1 compile and Run the application.
This Demo App shows how to detect the Wifi Networks and its properties such as Connected, MACAddress, MaxSpeed, etc.
Components used in MSIC SC Demo App:
TMiTeC_WiFi: Enumerates all detected or cached Wi-Fi networks and their properties.
TListView To list down the list of detected Wi-Fi networks.
Implementation Details:
An instance WiFi of TMiTeC_WIFI is created. Loop through the NetworkCount property to detect the available Wi-Fi networks. For each TWifiNetwork record list down the properties such as properties such as SignalQuality, SecurityEnabled, Connected, MACAddress, MaxSpeed, ChannelFreq in the list view.
procedure TwndMain.RefreshData;
var
i: Integer;
n: TListItem;
s: string;
begin
WIFI.RefreshData;
lv.Items.BeginUpdate;
try
lv.Items.Clear;
for i:=0 to lv.Items.Count-1 do
lv.Items[i].SubItems[0]:='0%';
for i:=0 to WIFI.NetworkCount-1 do begin
s:=WIFI.Networks[i].SSID;
if (s='') then
s:=WIFI.Networks[i].Profile;
n:=lv.FindData(0,Pointer(WIFI.Networks[i].ID),True,True);
if not Assigned(n) then begin
n:=lv.Items.Add;
n.Caption:=s;
n.SubItems.Add(Format('%d%%',[WIFI.Networks[i].SignalQuality]));
n.SubItems.Add(AuthToStr(WIFI.Networks[i].AuthAlgorithm));
n.SubItems.Add(CipherToStr(WIFI.Networks[i].CipherAlgorithm));
n.SubItems.Add(PHYToStr(WIFI.Networks[i].PHYType));
n.SubItems.Add(BSSToStr(WIFI.Networks[i].BSSType));
n.SubItems.Add(WIFI.Networks[i].MACAddress);
n.SubItems.Add(Format('%d dBm',[WIFI.Networks[i].RSSI]));
n.SubItems.Add(Format('%1.3f GHz',[WIFI.Networks[i].ChannelFreq/1000000]));
n.SubItems.Add(Format('%d',[GetChannelNumber(WIFI.Networks[i].ChannelFreq)]));
n.SubItems.Add(Format('%d Mbps',[WIFI.Networks[i].MaxSpeed]));
n.SubItems.Add(WIFI.Networks[i].Intf.Name);
n.Data:=Pointer(WIFI.Networks[i].ID);
end else begin
n.SubItems[0]:=Format('%d%%',[WIFI.Networks[i].SignalQuality]);
n.SubItems[5]:=WIFI.Networks[i].MACAddress;
n.SubItems[6]:=Format('%d dBm',[WIFI.Networks[i].RSSI]);
n.SubItems[7]:=Format('%1.3f GHz',[WIFI.Networks[i].ChannelFreq/1000000]);
n.SubItems[8]:=Format('%d',[GetChannelNumber(WIFI.Networks[i].ChannelFreq)]);
n.SubItems[9]:=Format('%d Mbps',[WIFI.Networks[i].MaxSpeed]);
end;
n.ImageIndex:=Integer(WIFI.Networks[i].SecurityEnabled);
if WIFI.Networks[i].Connected then
n.ImageIndex:=n.ImageIndex+2;
end;
finally
lv.Items.EndUpdate;
end;
end;
MiTeC WiFi Demo
It’s that simple to enumerate list of Wi-Fi networks and its properties available in your machine from your Delphi application. Use this MiTeC component suite and get the job done quickly.
Sun Feb 14 2021 05:30:02 GMT+0700 (Western Indonesia Time)
Falcon 9 – First Stage Simulatorは、エンジニアリング方程式を使用し、Falcon 9(SpaceX)ロケット 第1ステージの軌道の制御に加え、動作、進行力、パフォーマンスをシミュレートします。このソフトウェアは、Delphiによって構築されています。開発者は次のように解説しています。
「構造情報、エンジンの性能特性、スロットル制御曲線、機体の傾きなどをロードするいくつものパネルがあります。メインパネルには、シミュレーションの進行状況がリアルタイム表示されます。これは、OpenGLウィンドウの3Dモデル表示です。シミュレーションの最初の段階では、打ち上げ時の実際のビデオと同期し、シミュレーションの精度を評価するために各瞬間の速度と高度を比較できるようにしています。そしてシミュレーションが完了したら、すべての情報をExcelファイルにダウンロードして評価用のグラフを作成できます。アプリケーションのすべてのパラメーター(構造、エンジン、制御情報)は完全にカスタマイズ可能なので、必要なすべてのミッションを構成してシミュレーションでき、その結果を実際のビデオとリアルタイムで比較できます。アプリケーションはまだ開発中であり、シミュレーターでは、打ち上げ段階から、第2ステージの分離までシミュレートできるようになります。このアプリケーションは、Delphi Community Edition 10.3を使用して作成されました。」
CaseTalkは、FCO-IM(Fully Communication Oriented Information Modeling)と呼ばれるエレガントで実践的な理論に基づいて構築されています。FCO-IMは、著名なメソッドであるNIAMの後継です。元々、NIAMはデータベースモデリングの新しい方法を提示していましたが、最終的に一般的な情報モデリングの言語手法として進化してきました。詳細は、開発者のWebサイトにある、さまざまな記事リストをご覧ください。
Sat Feb 13 2021 23:34:02 GMT+0700 (Western Indonesia Time)
Itaocara is an app built in Delphi which shows companies in Itaocara RJ, Brazil opened or closed status because of COVID 19 and it is built with Delphi. It lists companies in the city of Itaocara RJ, Brazil, affected by decree that determined their closure. With the app the user gets in direct contact with the company by phone or whatsapp and can place his order and receive it by delivery. It is built in Delphi FireMonkey and is available on Google Play.
Sat Feb 13 2021 23:11:24 GMT+0700 (Western Indonesia Time)
Since 1995 – Channergy is a multi channel and omni channel manager, a Point of Sale (POS) and a full back office system that does more than talk to your web store and it is developed in Delphi. According to the developer, “with Channergy, you can process orders and manage inventory for all your channels and retail stores, interact with customers based on their buying habits, ship orders, and much more.
What makes Channergy different? It is a complete back office system. Use Channergy to update inventory in multiple locations, manage customers, send emails, create purchase orders, process returns, enter phone orders, track ads and much, much more. There are hundreds of features in the back office system alone that you won’t find in online solutions or simple channel managers – features you need to run your mail order business.
Channergy works with dozens of third party packages so you do not have to give up your favorite software. Ship with UPS Worldship, Fedex Manager, Endicia and more. Channergy exports to Quickbooks and other accounting packages – everything your bookkeeper and CPA needs is included. Process credit cards directly from Channergy with your choice of over one hundred credit card providers. Verify addresses with NCOA services like AccuZip and Mailers +4. Send and receive data from drop shippers, vendors, wholesalers and retailers. This list is as long as there are software systems.”
Sat Feb 13 2021 23:07:34 GMT+0700 (Western Indonesia Time)
The KronosNET system integrates several hundred devices from different manufacturers to ensuring their operation in a common environment and it is built in Delphi. According to the developer, “in addition to receiving, analyzing, visualizing and archiving incoming events from intrusion and fire prevention systems, access control, GPS location, CCTV and industrial automation (analog measurements), the system also supports administrative activities related to the service and inventory of devices, billing, setting work schedules for security agencies and customer care and contract management. The latest development direction of the KronosNET platform is the use of AI and Big Data analyzes. This product is used around the world in several hundred security agencies for monitoring from between several and thousands of accounts simultaneously. The KronosNET system is used not only in security agencies, but also in banks, in critical infrastructure (power plants, military, airports, embassies) and corporations.”
The developer goes on to say that, “The three-layer architecture, which is standard for our solutions, encrypted communication, secure buffers stored in permanent memory, and transmission of differentiation between modules, are only some of the mechanisms that render the KronosNET system safe and efficient even for a large number of accounts under surveillance. The communication mechanism that is used allows for significant system dispersal even via poor communication channels, which ensures a high level of comfort. The architecture model employed also allows the system to be easily expanded to include additional functionality without affecting existing mechanisms, while making it possible for information to be exchanged with external applications. The system communicates with the user via all modern communication channels including: PC and SmartPhone applications, websites, text messages or e-mails, and also supports digital phone network.”
Some statistics provided by the developer about KronosNET are:
Software developed for over 18 years
Over 30 IT specialists working on the project
18 modules of system KronosNET
Over 3.5 million lines of code
More than 200 integrated external modules
More than 400 clients all around the world
More than 200.000 of monitored accounts (buildings, persons, guards, vehicles, response teams vehicles, CIT vehicles, vanding machines, service vehicles)
Sat Feb 13 2021 23:00:03 GMT+0700 (Western Indonesia Time)
Basket Scouting is the innovative statistical survey software directly on the playing field, complete with support for interactive shooting maps and it is developer in Delphi. According to the developer, “you can say goodbye to pen and paper and check all the events of the game on your computer and produce a large series of prints. As a specific software for basketball teams, it was designed to manage game statistic in a simple way. The software operates in real time and has the ability to record all the sensitive events. At the end of each game, you may print a summary or simply publish it on your website.” The light and dark themes provided by Delphi really look nice on this software.
Sat Feb 13 2021 22:57:24 GMT+0700 (Western Indonesia Time)
SVGShellExtensions adds SVG viewing and support to Windows Explorer and it is built with Delphi. According to the developer, “SVGShellExtensions is a collection of extensions tools for SVG files, integrated into Microsoft Windows Explorer (Vista, 7, 8 and 10):
a Preview handler which allows you to see the SVG image without open it, in the “Preview Panel”.
a Thumbnail handler which allows you to see the SVG image into Windows Explorer.
(TODO) an SVG-XML Text Editor to manually edit and preview the text of SVG files.
Remarkable features of the SVGShellExtensions include having a light and dark theme according to users’ preferences. SCGSHellsExtensions also supports Windows Vista 7, 8, and 10 (Only for 64 bits). If you have a Delphi 10.4 Sydney, you can manually build this project.” This is a powerful add on for Windows Explorer and really brings SVG support in Windows to life.
Sat Feb 13 2021 22:41:22 GMT+0700 (Western Indonesia Time)
“DumbCy” is a charades game played with movie names and it is developed in Delphi for Android. According to the developer, “A whole fresh way of playing dumb charades with your friends! I grew up playing this game with my family and friends. And, it still is one of the games we play when friends and family gathers. I am sure many of you can relate to this and have a similar experience. It was my long time desire to write an app for “Dumb Charades”. Here I am, presenting you the very first version of my effort. Enjoy DumbCy!” It is always great to see games built in Delphi because it shows how FireMonkey can really shine across a broad range of software types.
Sat Feb 13 2021 22:40:00 GMT+0700 (Western Indonesia Time)
You’ve landed on Human Capital, a weekly newsletter detailing the latest in diversity, equity, inclusion and labor. Sign up here to receive the newsletter every Friday at 1 p.m. PT.
There’s some new legislation that hopes to prevent the use of non-disclosure agreements in workplace situations involving all forms of discrimination and harassment. That would be huge for the tech industry, where NDAs have become commonplace in severance agreements.
Meanwhile, All Raise, Coursera and Niantic announced some new initiatives designed to increase diversity in tech.
I’ve also included an early look of a story I’m working on about the pipeline myth. Lots more to discuss so let’s get to it.
New legislation seeks to get rid of NDAs in cases of harassment or discrimination
“It was a legal gamble,” Ozoma told TechCrunch about coming forward with claims of both racial and gender discrimination, despite having signed an NDA. Pinterest could’ve decided to sue both Ozoma and Banks, Ozoma said, but that would’ve required the company to admit wrongdoing.
Meredith Whittaker, faculty director at AI Now and Google walkout co-organizer on SB 331
I also caught up with Whittaker, who said this type of legislation is absolutely necessary:
From a structural perspective, it’s really evident we’re not going to change toxic, discriminatory tech environments without naming the problems. We have decades of failed DEI PR, decades of people blaming the pipeline and decades of brilliant people like Ifeoma, Aerica andTimnit being harassed and pushed out of these environments. And oftentimes, people aren’t able to speak about their experiences so that the deep toxicity of these environments — the way it’s built into the structural operating procedures of these companies and workplaces — doesn’t get aired.
Musings on the pipeline problem
My conversation with Whittaker led to me being introduced to Dr. Joy Lisi Rankin, a research lead for gender, race and power in artificial intelligence at theAI Now Institute. She’s actively researching the history of the pipeline problem and took some time to chat with me about it. I’m not done with the story yet, but here’s a little teaser:
The very high-level view is, people have been talking about a pipeline problem in some form since the seventies,” Rankin told me. “And before that, often, it was like a quote, manpower problem, by focusing on who has PhDs or master’s degrees in a field or who has elite jobs in a field. But that focus is always on individuals. It’s on tracking people, not institutions and not structures. So this is why I think it continues to be a convenient excuse for a host of sins, because talking about a pipeline makes it seem as if all things are equal in the United States, and we just have to find a way to keep people in. But the truth is, when we think about a STEM pipeline, we don’t talk about the fact that education in the United States is by no means equal from birth onwards.
Ex-Salesforce manager alleges microaggressions and inequity
Ultimately, Perry said she left her job because she had been “Gaslit, manipulated, bullied, neglected, and mostly unsupported” by folks she chose not to name.
Salesforce provided the following statement to TechCrunch:
For privacy reasons, we can’t comment on individual employee matters but Equality is one of our highest values and we have been dedicated to its advancement both inside and outside of our company since we were founded almost 22 years ago.
All Raise aims to increase diversity at the board level
Despite recent efforts to improve diversity at the board level, the number of Black, brown and women board members is still low. All Raise is looking to fix that with the recent launch of Board Xcelerate. Already, its 90-day search process has resulted in the placement of five independent board members.
Here’s the gist of the program:
We start by talking with investors, talent partners, and CEOs who want to fill their open independent board seats. Then, we kick off a fast, 90-day closed search process through a pool of talent sourced from our own network and an external advisory committee, supported and executed by a retained executive search firm. Finally, we connect the companies and candidates to interview and determine the best fit.
Coursera makes some Black History Month commitments
Ed tech company Coursera partnered with Howard University, a historically Black university, to beef up its social justice content on the online platform. Coursera also partnered with Facebook to provide scholarships to Black folks who would like to learn more about social media marketing. Lastly, Coursera partnered with non-profit Black Girls Code to offer up to 2,000 young Black girls free access to the Coursera catalog.
Last week, AWU filed a complaint with the NLRB alleging Google contract workers were silenced about pay and that the company fired a worker for speaking out about it. Now, the worker in question, Shannon Wait, is back at work.
“Shannon’s back at work b/c she had a union to turn to when she was illegally suspended,” AWU said in a tweet. “She came to us, we raised hell, & a week later, she’s back.”
Amazon warehouse worker union vote begins
Earlier this week, Amazon warehouse workers in Bessemer, Alabama began voting to decide whether or not they will unionize with the Retail, Wholesale and Department Store Union. The beginning of the vote came shortly after the National Labor Relations Board rejected Amazon’s attempt to delay the vote.
By unionizing, Amazon workers hope to gain the right to collectively bargain over their working conditions, like safety standards, pay, breaks and other issues. Unionizing would also enable workers to potentially become “just cause” employees versus at-will, depending on how the negotiations go.
Mail-in voting ends March 29, with the NLRB set to begin counting ballots the following day on a virtual platform.
The latest in Prop 22 battles
Despite the CA Supreme Court rejecting to hear the lawsuit challenging Prop 22’s constitutionality, the Service Employees International Union filed a similar suit in a lower court, the Alameda County Superior Court.
Meanwhile, the CA Supreme Court rejected Uber and Lyft’s request for it to review a lower court’s decision about whether they misclassified their drivers as independent contractors. The decision in question stated that drivers should be classified as employees, but then Prop 22 passed and made it so, moving forward, Uber and Lyft are legally able to classify their drivers as independent contractors.
TechCrunch Sessions: Justice agenda is out!
We released the agenda for the upcoming Justice event on March 3. We’re pumped to be able to host Backstage Capital founder and Managing Partner Arlan Hamilton, Gig Workers Collective’s Vanessa Bain, Alphabet Workers Union Executive Chair Parul Koul, Color of Change President Rashad Robinson, Anti-Defamation League CEO Jonathan Greenblatt and others.
Sat Feb 13 2021 22:38:09 GMT+0700 (Western Indonesia Time)
Wall-YE utilizes a suite of software apps built in Delphi and C++ for agricultural automation through robotics. According to the developer, “Delphi does weed control: agricultural and wine-growing robots are revolutionizing our fields. An alternative and modern solution for farmers and winegrowers Wall-YE offers a new solution to farmers and winegrowers: the Myce robot. Available in several versions (inter-row, straddle and grape harvester and market gardener), it is already revolutionizing the daily life of these professionals. The advantages: being able to stop using chemical treatment and weeding products, reducing the costs of maneuver and limit the arduous and physical aspects of the job. Equipped with a powerful mapping software, the robot traverses the land to delimit the plots, analyze the feet of vineyard, map the future vegetables to be harvested, detect and pull out weeds, etc. It is thus placed as world leader in wine and agricultural robotics. All software and applications are developed in Delphi and C ++ and thanks to the efficiency of the FireMonkey framework, they are also cross-platform.”
Sat Feb 13 2021 22:32:46 GMT+0700 (Western Indonesia Time)
maXbox is an open source script studio with an Object Pascal scripting language. According to the developer, “it is an open-source script tool engine, compiler, and source library, all in one. Use it to design and code your scripts! Pure Code for Object Pascal Scripting. The guiding principles are simplicity and the reduction of complexity to the max. The app is self-containment “out of the box” with no need for installation or registration.”
Sat Feb 13 2021 22:26:20 GMT+0700 (Western Indonesia Time)
Creature, by Kenthor Games, is a creature management application halfway between Pokémon and Tamagotchi with 27 creatures included in 3 evolution trees (Fire, Plant, Water). The app is built in Delphi and available for Windows and Android. There are some fun looking graphics here and the app is great to see. The game is not available from Google Play yet looks like but Android does support side loading.
Sat Feb 13 2021 22:18:08 GMT+0700 (Western Indonesia Time)
GIS Field Survey Application for iPad Built in Delphi-FMX. According to the developer, “Mobile Matilda is a mobile GIS application designed for Apple iPad tablet computers. The application operates in a local (off-line) environment or with on-line data streaming. Off-line operation is possible by reading GIS map layers and data from the iPad memory. Even huge GIS datasets can be efficiently stored to the iOS device memory as SQLite database layers. Relevant records are accessed simply by tapping and selecting on the tablet computer. Users can update records (e.g, map location of assets, attribute information, photo angle) in the field for later synchronization to the desktop or server via a secure WiFi or GSM connection. The iPad’s GPS position information is used to re-center the map (or aerial photography layer) to the user’s current position. Attaching photos to survey records is possible using the iPad’s built-in camera or a linked 360-degree panoramic camera. Mobile Matilda is used by municipal governments in Japan to conduct field surveys of physical assets. The application is developed in Delphi-FMX from the TatukGIS Developer Kernel edition for Delphi-VCL/FMX (see www.tatukgis.com).”
Sat Feb 13 2021 22:15:36 GMT+0700 (Western Indonesia Time)
Docto is a ‘command line only’ application that interacts with Word via COM to open and resave files in alternative formats. According to the developer, “most people who use it convert from Word Documents to PDF but Docto can convert from Text Files, HTML Files, RTF Files into Word Documents, HTML Files, XPS Files etc using Office Applications as the conversion engine. Docto was originally written using Delphi 7 and now compiles without any issues on Delphi 10.3 It takes advantage of Delphi’s really good COM support to interact with Word and other Microsoft Office application for document conversion. Originally written for an internal requirement to have a simple way to convert Recipe Documents into PDFs, it was an obvious candidate, once tidied up, to provide as open source on Github. Delphi was the obvious programming language to develop this is as it has very comprehensive and straightforward COM support.”
Sat Feb 13 2021 21:00:23 GMT+0700 (Western Indonesia Time)
Welcome back to The TechCrunch Exchange, a weekly startups-and-markets newsletter. It’s broadly based on the daily column that appears on Extra Crunch, but free, and made for your weekend reading. Want it in your inbox every Saturday morning? Sign up here.
Ready? Let’s talk money, startups and spicy IPO rumors.
Earlier this week TechCrunch broke the news that Public, a consumer stock trading service, was in the process of raising more money. Business Insider quickly filled in details surrounding the round, that it could be around $200 million at a valuation of $1.2 billion. Tiger could lead.
Public wants to be the anti-Robinhood. With a focus on social, and a recent move away from generating payment for order flow (PFOF) revenues that have driven Robinhood’s business model, and attracted criticism, Public has laid its bets. And investors, in the wake of its rival’s troubles, are ready to make it a unicorn.
Of course, the Public round comes on the heels of Robinhood’s epic $3.4 billion raise, a deal that was shocking for both its scale and speed. The trading service’s investors came in force to ensure it had the capital it needed to continue supporting consumer trades. Thanks to Robinhood’s strong Q4 2020 results, and implied growth in Q1 2021, the boosted investment made sense.
As does the Public money, provided that 1) The company is seeing lots of user growth, and 2) That it figures out its forever business model in time. We cannot comment on the second, but we can say a bit about the first point.
Thanks not to Public, really, but M1 Finance, a Midwest-based consumer fintech that has a stock-buying function amongst its other services (more on it here). It told TechCrunch that it saw a quadrupling of signups in January as compared to December. And in the last two weeks, it saw six times as many signups as the preceding two weeks.
Given that M1 doesn’t allow for trading — something that its team repeatedly stressed in notes to TechCrunch — we can’t draw a perfect line between M1 and Public and Robinhood, but we can infer that there is huge consumer interest in investing of late. Which helps explain why Public, which is hunting up a way to generate long-term incomes, can raise another round just months after it closed a different investment.
Our notes last year on how savings and investing were the new thing last year are accidentally becoming even more true than we expected.
Market Notes
As the week came to a close, Coupang filed to go public. You can read our first look here, but it’s going to be big news. Also on the IPO beat, Matterport is going out via a SPAC, I chatted with Metromile CEO Dan Preston about his insurtech public offering this week that also came via a SPAC, and so on.
Oscar Health filed, and it doesn’t look super strong. So its impending valuation is going to test public traders. That’s not a problem that Bumble had when it priced above-range this week and then skyrocketed after it started to trade. Natasha and I (she’s on Equity, as well) have some notes from Bumble CEO Whitney Wolfe Herd that we’ll get to you early next week. (Also I chatted about the IPO with the BBC a few times, which was neat, the first of which you can check out here if you’d like.)
Near to the IPO beat, Carta started to allow its own shares to trade recently, on the back of news that its revenues have scaled to around $150 million. Not bad Carta, but how about a real IPO instead of staying private? The company’s valuation more than doubled during the secondary transitions.
And to close, a small callout to Ontic, which provides “protective intelligence software” and said that its revenue grew 177% last year. I appreciate the sharing of the numbers, so wanted to highlight the figure.
Various and Sundry
Wrapping this week, I have a final bit for you to chew on from Mark Mader, the CEO of Smartsheet, a public company — former startup, it’s worth noting — that plays in the no-code, automation and collaboration markets. That’s a rough summary. Anyhoo, I asked Mader about no-code trends in 2021, as I have my eyes on the space. Here’s what he wrote for us:
If you thought the sudden shift to remote work sped up corporate America’s shift to digital, you haven’t seen anything yet. Digital transformation is going to accelerate even more rapidly in 2021. Last year, the workforce was exposed to many different types of technology all at once. For example, a company may have deployed Zoom or DocuSign for the first time. But much of this shift involved taking analog processes like meetings or document signing and approval and bringing them online. Things like this are merely a first step. 2021 is the year the companies will begin to connect large-scale digital events to infrastructure that can make them automated and repeatable. It’s the difference between one person signing a document and hundreds of people signing hundreds of documents, with different rules for each one. And that’s just one example. Another use case could involve linking HR software to project management software for automated, real-time resource allocation that allows a company to get more out of both platforms, as well as its people. The businesses that can automate and simplify complex workflows like these will see dramatically improved efficiency and return on their technology investments, putting them on the path to true transformation and improved profitability.
This week, I covered Zeta, a new startup working on joint finances for modern couples. It aims to take away the money chores of a relationship, from splitting the bill at dinner to requesting rent through a payment app every month.
Aditi Shekar, the co-founder, gave me some notes about why the ongoing popularity of Venmo is validation for the company, instead of competition.
The success of Zeta hinges on the idea that people want to share their finances in an ongoing and meaningful way, and that the world of finance is ready to shift from individualism to collectivism earlier and louder. It sounds daunting, but we already know that social finance is big, as shown by apps like Venmo and Splitwise, and phenomena like the GameStop saga from just a few weeks ago.
Other startups have taken notice too, entering the world of multiplayer fintech, a term that categorizes socially focused and consumer-friendly financial services. Braid, a group-financing platform, is trying to make transactions work for various entities, from shared households to side hustles to creative projects.
Money is emotional and complex, and the opportunity within the multiplayer fintech reflects just that. The next wave of products will be able to straddle the line of comfort to successfully get adoption, and cultural shift to successfully deliver a truly collaborative cash experience.
In the rest of this newsletter, we’ll talk about the new career path to CEO, our favorite startups from Techstars Demo Day and the latest SPAC you should probably know about. As always, you can find me on Twitter @nmasc_ or e-mail me at natasha.m@techcrunch.com. Want this in your inbox each week? Sign up here.
Data on startups is dreadful
Data about startups is helpful to understand directional trends and how the flow of capital works and changes over time. But as ventures as an asset class grows and the documentation around raises gets thornier, the data can sometimes be missing a big chunk of what’s actually happening on the scenes.
Here’s what to know per Danny Crichton and Alex Wilhelm:PSA: most aggregate VC trend data is garbage and Are SAFEs obscuring today’s seed volume are two pieces that explain some of the reasons why the numbers might be flawed today. The good news is that the government is also in the dark about funding data; the bad news is that without good tracking, we don’t know how progress is being made.
Etc: Shameless plug for you to tip us on Secure Drop, TechCrunch’s submission system for any news you think is important to share. You can stay anonymous.
Image via Getty Images / Sadeugra
The new CEO
Amazon founder and CEO Jeff Bezos announced weeks ago that he was shifting into an executive chairman role and AWS CEO Andy Jassy would take over as chief executive. In this analysis, our enterprise cloud reporter Ron Miller explores the question: is overseeing cloud operations the new path to CEO?
Here’s what to know, per Andrew Bartels, an analyst at Forrester Research:
“In both cases, these hyperscale business units of Microsoft and Amazon were the fastest-growing and best-performing units of the companies. [ … ] In both cases, cloud infrastructure was seen as a platform on top of which and around which other cloud offerings could be developed,” Bartels said. The companies both believe that the leaders of these two growth engines were best suited to lead the company into the future.
TechCrunch covered favorites from Techstars’ three Demo Days, which were focused on Chicago, Boston and workforce development. Make sure to dig into the startups yourself to form your own opinions, but if you care what stood out to us, here’s what we ended up with.
Here’s what to know: The reason I love Demo Days is that it’s a fast way to understand what the next wave of startups and entrepreneurs are thinking about. In this year’s cohorts, we saw an exclusive sneaker marketplace, flexible life insurance and a part-time childcare platform that helps parents cover random gaps in their childcare schedule.
Here’s what to know per Kirsten Korosec, our transportation editor:
The agreement to go public and the order from United Airlines comes less than a year after Archer Aviation came out of stealth. Archer was co-founded in 2018 by Adam Goldstein and Brett Adcock, who sold their software-as-a-service company Vettery to The Adecco Group for more than $100 million. The company’s primary backer was Lore, who sold his company Jet.com to Walmart in 2016 for $3.3 billion. Lore was Walmart’s e-commerce chief until January.
SoftBank earnings always give key insights about how a heavyweight in venture capital is performing (and the bonanza always comes with a healthy share of content and memes). This week on Equity, we couldn’t resist nerding out about it:
Of course, if SoftBank isn’t your jam, there was a whole host of other news we chatted about, from Reddit’s latest raise to DoorDash buying a salad robot. Listen here.
Sat Feb 13 2021 17:06:33 GMT+0700 (Western Indonesia Time)
Welcome back to This Week in Apps, the weekly TechCrunch series that recaps the latest in mobile OS news, mobile applications and the overall app economy.
The app industry is as hot as ever, with a record 218 billion downloads and $143 billion in global consumer spend in 2020.
Consumers last year also spent 3.5 trillion minutes using apps on Android devices alone. And in the U.S., app usage surged ahead of the time spent watching live TV. Currently, the average American watches 3.7 hours of live TV per day, but now spends four hours per day on their mobile devices.
Apps aren’t just a way to pass idle hours — they’re also a big business. In 2019, mobile-first companies had a combined $544 billion valuation, 6.5x higher than those without a mobile focus. In 2020, investors poured $73 billion in capital into mobile companies — a figure that’s up 27% year-over-year.
This week, we’re taking a look at the Bumble IPO, app store subscription revenue and talk to a developer on a crusade against the fake ratings plaguing the App Store. We’re also checking in on the missing Google privacy labels…with a spreadsheet of all 100 apps.
Bumble, the dating app positioned as one of Tinder’s biggest rivals, began trading on public markets on Thursday. The company priced its shares at $43, above its earlier target range of $37 to $39. But once live, BMBL began trading up nearly 77% at $76 per share on Nasdaq, closing the day with a market cap of $7.7 billion and the stock at $70.55.
The app itself was founded in 2014 by early Tinder exec Whitney Wolfe Herd, who now, at 31, is the youngest woman founder to take a U.S. company public and, thanks to the IPO, the world’s youngest self-made woman billionaire, as well, said Fortune.
"I want to thank the remarkable women who paved the way for @Bumble in the public markets."
Wolfe Herd successfully leveraged her knowledge of the online dating market, then combined that with an understanding of how to position a dating app to make it more appealing to women.
On Bumble, women message first, for example, and the company often touts features and updates designed to protect women from bad actors. A lot of what Bumble does is just marketing and spin overlaid on the Tinder model. Like other dating apps, Bumble uses a similar format to connect potential matches: a swipeable “people catalog,” where users look at photos, primarily, to determine interest. Bumble, like others, also makes money by charging for extra features that give users a better shot or more efficient experience.
But all this works because users believe Bumble to be different. They believe Bumble is also capable of delivering higher-quality matches than Tinder, which has increasingly re-embraced its persona as a hook-up app.
The IPO’s success also sends a signal that investors are expecting in-person dating to rebound post-pandemic, and getting in early on the next big mass market dating app is an easy win.
Developer crusades against scammy subscription apps
Developer Kosta Eleftheriou, a Fleskly co-founder, has been on a crusade against the scammy and spammy apps overrunning the App Store, as well as Apple’s failure to do much about it.
Earlier this month, Kosta complained that copycat apps were undermining his current business, as the developer of an Apple Watch keyboard app, FlickType. Shady clones boosted by fake ratings and reviews promised the same features as his legit app, but then locked their customers into exorbitant subscriptions, earning the scammers hundreds of thousands per month.
In his eyes, the problem wasn’t just that clones existed, but that Apple’s lack of attention to fake reviews made those apps appear to be the better choice.
What Apple doesn’t want you to know about the App Store
“The apps you love, from a place you can trust” they tell you. But the reality is far from it.
A 4.5-star app? Might as well be a multi-million dollar scam.
Although Apple finally removed most of his fraudulent competitors after his rants gained press attention, he’s frustrated that the system was so broken in the first place.
This week, Kosta returned with another Twitter thread detailing the multimillion-dollar scams that pretend to be the best Roku remote control app. One app, “Roku Remote Control – Roki,” for example, had a 4.5 stars across 15K+ ratings. The app was a free download, but immediately tries to lock users into a $4.99/week subscription or a lifetime payment of $19.99. However, the app offers a “buggy, ad-infested, poorly designed” experience, Kosta says.
He then used AppFigures to see only those reviews of the Roki app that also had text. When displayed like this, it was revealed that “Roki” was really just a 1.7-star app, based on consumers who took the time to write a review.
What’s worse, Kosta has also argued, that even when Apple reacts by removing a bad actor’s app, it will sometimes allow the developer to continue to run other, even more profitable scams.
Kosta says he decided to spearhead a campaign about App Store scams to “get the word out about how all these scams manage to sustain themselves through a singular common flaw in the App Store — one that has been broken for years.”
“The way Apple tried to communicate with me also didn’t help ease my concern — they either don’t get it, or are actively trying to let the story fizzle out through some token gestures. But what they need to do first and foremost, is acknowledge the issue and protect their customers,” Kosta told TechCrunch.
One potential argument here is that because Apple financially benefits from successful subscription app scams, it’s not motivated to prioritize work that focuses on cleaning up the App Store or fake ratings and reviews. But Kosta believes Apple isn’t being intentionally malicious in an effort to grow the subscription business, it’s just that fake App Store reviews have become “a can that’s been perpetually kicked down the road.” Plus, since Apple touts the App Store as a place users can trust, it’s hard for them to admit fault on this front, he says.
Since the crusade began, Kosta has heard from others developers who have sent him examples “dozens and dozens of scams.”
“I will just keep exposing them until Apple acknowledges the problem,” he says.
Top subscription apps grew 34% to $13B in 2020
Apps saw record downloads and consumer spending in 2020, globally reaching somewhere around $111 billion to $112 billion, according to various estimates. But a growing part of that spend was subscription payments, a report from Sensor Tower indicates. Last year, global subscription app revenue from the top 100 subscription apps (excluding games), climbed 34% year-over-year to $13 billion, up from $9.7 billion in 2019.
The App Store, not surprisingly, accounted for a sizable chunk of this subscription revenue, given it has historically outpaced the Play Store on consumer spending. In 2020, the top 100 subscription apps worldwide generated $10.3 billion on the App Store, up 32% over 2019, compared with $2.7 billion on Google Play, which grew 42% from $1.9 billion in 2019. (Read more here.)
Google said it would update its iOS apps with privacy labels weeks ago. While it did roll out some, it has yet to update top apps with Apple’s new labels, including key apps like the Google search app, Google Pay, Google Assistant, Google One, Google Meet, Google Photos, Google Calendar, Google Maps, Google News, Google Drive, Gmail and others. (Keep track of this with me here. Want to help? Email me.)
Overall, the majority of Google’s apps don’t have labels. While Google probably needed some time (and a lot of lawyers) to look this over, it’s now super late to put its labels out there. At this point, its iOS apps are out of date — which Google accidentally alerted users to earlier this week. This is awful optics for a company users already don’t trust, and a win for Apple as a result. (Which, of course, means we need to know for sure that Apple isn’t delaying Google’s submissions here…)
Still, Google had time to get this done. Its December code freeze is long over, and everyone else, for the most part, has gotten on board with the new labels. Why can’t Google?
Google's iOS apps release cycle before & after Apple asks to disclose privacy labels.
Thie pattern is probably just a coincidence. We all know "transparency forms the bedrock of [their] commitment to users"… pic.twitter.com/UgJjAhWfkm
Apple may soon allow users to set a different default music service. The company already opened up the ability to choose a different default browser and email app, but now a new feature in the iOS 14.5 beta indicates it may allow users to set another service, like Spotify, as the default option when asking Siri to play tunes. This, however, could be an integration with HomePod and Siri voice control support in mind, rather than something as universal as switching from Mail app to Gmail.
Apple Maps to gain Waze-like features for reporting accidents, hazards and speed traps. Another new feature in the iOS 14.5 beta will allow drivers to report road issues and incidents by using Siri on their iPhone or through Apple’s CarPlay. For example, during navigation, they’ll be able to tell Siri things like “there’s a crash up head,” “there’s something on the road,” or “there’s a speed trap here.”
Apple tests a new advertising slot on the App Store. Users of Apple’s new iOS 14.5 beta have reported seeing a new sponsored ad slot that appears on the Search tab of the App Store, under the “Suggested” heading (the screen that shows before you do a search). The ad slot is also labeled “Ad” and is a slightly color to differentiate it from the search results. It’s unclear at this time if Apple is planning to launch the ad slot or is just testing it.
The App Store announces price changes for Cameroon, Zimbabwe, Germany and the Republic of Korea.
Apple alerts developers to Push Notification service server certificate update, taking place on March 29, 2021.
Platforms: Google
Image Credits: XDA Developers
Alleged Android 12 screenshots snagged from an early draft document by XDA Developers show Google could be borrowing some ideas from Apple’s iOS for its next update. One feature may put colored dots in the status bar to indicate when the camera or microphone are being accessing, for example. Users may also be able to toggle off their camera, microphone or location access entirely. Google may also add a “conversations” widget to show recent messages, calls and activity statuses, among other things.
Google bans data broker Predicio that was selling user data collected from a Muslim prayer app to Venntel, a government contractor that sells location data from smartphones to ICE, CBP and the FBI, following a Motherboard investigation. Google alerted developers they had a week to remove the SDK from their apps or they’d be removed from Google Play.
Google updated its instructor-led curriculum for Android Development with Kotlin, a major update for the course materials that were first released in 2018. The new materials are designed for either in-person or virtual learning, where educators combine lectures and codelabs.
Google briefly notified users that their Google iOS apps were “out of date” — an embarrassing mistake that was later corrected server-side. The bug arrived at a time when Google has yet to have updated its privacy labels for many of its largest apps, including Google, Gmail, Assistant, Maps, Photos and others.
Augmented Reality
Apple released a new iOS app, For All Mankind: Time Capsule, to promote its Apple TV+ series, “For All Mankind.” The app was built using Apple’s ARKit framework, offering a new narrative experience told in AR format featuring the show’s star. In the app, users join Danny as he examines keepsakes that connect to stories about impacting events in the lives of his parents, Gordo and Tracy Stevens, in the alternative world of the TV show.
E-commerce
TikTok is expanding its e-commerce efforts. The company told marketers it’s planning a push into livestreamed e-commerce, and will also allow creators to share affiliate links to products, giving them a way to earn commissions from their videos. The company also recently announced a partnership with global ad agency WPP that will give WPP agencies and clients early access to TikTok ad products. It will also connect top creators with WPP for brand deals.
The Single Day Shopping festival drove high mobile usage. Consumers spent 2.3 billion hours in Android shopping apps during week of November 8-15, 2020, reports App Annie.
Social
Image Credits: AaronP/Bauer-Griffin/GC Images
TikTok’s sale of its U.S. operations to Oracle and Walmart is shelved. The Biden administration undertook a review of Trump’s efforts to address security risks from Chinese tech firms, including the forced sale of TikTok’s U.S. operations. The Trump administration claimed TikTok was a national security threat, and ordered TikTok owner ByteDance to divest its U.S. operations if it wanted to continue to operate in the country. Several large tech companies stepped up to the plate to take on the potential windfall. But Biden’s review of the agency action puts Trump’s plan on an indefinite pause. As a result, the U.S. government will delay its appeal of of federal district court judge’s December 2020 injunction against the TikTok ban. Discussions between U.S. national security officials and ByteDance are continuing, however.
Facebook is said to be building its own Clubhouse rival. Mark Zuckerberg made a brief appearance on Clubhouse earlier this month, which now seems more like a reconnaissance mission, if The NYT’s report is true. Facebook will have to tread lightly, given its still under regulatory scrutiny for anticompetitive practices, which included cloning and acquiring its competition.
Microsoft reportedly approached Pinterest about an acquisition of the $51 billion social media platform, but those talks are no longer active.
TikTok partnered with recipe app Whisk to add a way for users to save recipes featured in TikTok videos. The feature is currently in pilot testing with select creators.
Mark Cuban is co-founding a new podcast app, Fireside. The Shark Tank star and investor has teamed up with Falon Fatemi, who sold customer intelligence startup Node to SugarCRM last year. Fireside is basically Clubhouse, but adds the ability to export live conversations as podcasts.
Indian firm ShareChat will integrate Snapchat’s Camera Kit technology into its Moj app to enable AR features. The move will give Snap a foothold in a key emerging market.
Instagram said it will impose stricter penalties against those who send abusive messages, including account bans, and develop new controls to reduce the abuse people see in their DMs. The announcement followed a recent bout of racist abuse targeted at footballers in the U.K. A joint statement from Everton, Liverpool, Manchester United and Manchester City condemned the abuse, saying “there is no room for racism, hate or any form of discrimination in our beautiful game.”
Instagram tells creators that it won’t promote their recycled TikToks. The company announced via its @creators account a set of best practices for Reels, noting that those featuring a watermark or logo (which TikTok smartly attaches to its content), won’t be recommended frequently on Instagram’s platform. Of course, TikTok creators are already circulating videos with tips about how to cut out the logo from TikTok videos by first exporting the video as a Live Photo, then going to their iOS Photos app, clicking on the Live Photo and choosing “Save as Video.” Problem solved.
Photos
Image Credits: Google
Google Photos for Android adds previously Pixel-only features — but only if users subscribe to Google One. The paywalled features include machine learning-powered editing tools like Portrait Blur, Portrait Light and Color Pop. There’s also a new video editor on iOS with an Android update planned. The editor now lets you crop, change perspective, add filters, apply granular edits (including brightness, contrast, saturation and warmth) and more.
Waze adds Audible to its list of in-app audio players.The integration allows you to easily play your audiobooks while driving. Waze already supported in-app music integrations, like YouTube Music and Spotify, thanks to developer integrations with the Waze Audio Kit.
HBO Max is going international. The app will be expanded to 39 Latin American and Caribbean territories in June, replacing the existing HBO GO app.
Picture-in-picture mode returned to YouTube on iOS with the launch of the iOS 14.5 beta.
Messaging
Facebook Messenger added a new feature that makes it easier to block and mass-delete Message Requests from people you don’t know. It also said it’s working on new ways to report abuse and providing better feedback on the status of those reports.
The Biden administration pauses the Trump ban on WeChat. The administration asked a federal appeals court to place a hold on proceedings over the WeChat a day after it asked for a similar delay over the TikTok case, saying it needed time to review the previous administration’s efforts, which are now in the appeals stage.
Health & Fitness
NHS Covid-tracing app has prevented 600,000 infections in England and Wales, researchers estimatedin one of the first studies of smartphone-based tracing. The app used the tracing system built by Apple and Google.
Fintech
The Robinhood backlash hasn’t stopped the downloads. Many users downrated the app after it halted meme stock trading earlier this month — a move that’s now under Congressional investigation and has prompted multiple lawsuits. But the app continues to receive downloads. The day after it halted trades was its second-largest by downloads ever, and downloads remained high in the days that followed. In January 2021, the app was installed 3.7 million times in the U.S., or 4x the installs of January 2020.
Government & Policy
Image credits: Thomas Trutschel/Photothek via Getty Images
The Chinese government blocked Clubhouse, which had been rapidly gaining attention in the country. The app itself had only briefly been made available in Apple’s China App Store last fall, but those had it installed could access its audio chat rooms without a VPN. Prior to the ban, a group discussing the 1989 pro-democracy Tiananmen protest reached 5,000 participants — the max number of participants Clubhouse supports.
A new North Dakota Senate bill proposes to ban app stores like Apple and Google from requiring developers to exclusively use their store and payment mechanisms to distribute apps, and would prevent them from retaliating, at the risk of fines. Apple’s Chief Privacy Engineer Erik Neuenschwander said the bill “threatens to destroy the iPhone as you know it,” and that Apple succeeds because it “works hard to keep the bad apps out of the App Store.”
The Coalition for App Fairness (CAF) announced that Meghan DiMuzio has now joined as its first executive director. The advocacy group fighting against app store anticompetitive behavior is made up of over 50 members, including Spotify, Tile, Basecamp, Epic Games and others.
Security & Privacy
The U.S. House of Representatives Committee on Energy and Commerce has asked Apple to improve the credibility of App Store privacy labels, so consumers aren’t harmed. The request was made after an investigation by The Washington Post revealed that many labels were false, leading to questions as to whether the labels could be trusted at all.
Apple will begin to proxy Google’s “Safe Browsing” service used by Safari through its own servers starting with iOS 14.5. Safari on iPhone and iPad includes a “Fraudulent Website Warning” feature that warns users if they’re visiting a possible phishing site. The feature leverages Google’s “Safe Browsing” database and blocklist. Before, Google may have collected user’s IP address during its interaction with Safari, when the browser would check the website URL against Google’s list. Now, Apple will proxy the feature through Apple’s own servers to limit the risk of information leaks. The change was reported by The 8-bit, MacRumors and others, after a Reddit sighting, and confirmed by Apple’s head of Engineering for WebKit.
This article is a bit confused on the details of how Safe Browsing works, but in the new iOS beta, Safari does indeed proxy the service via Apple servers to limit the risk of information leak.https://t.co/TlDZNMO8do
A generically named app “Barcode Scanner” on the Google Play Store had been operating as a legit app for years before turning into malware. Users of the app, which had over 10 million installs, began to experience ads that would open their browser out of nowhere. The malware was traced to the app and Google removed it from the Play Store. Unfortunately, users review-bombed a different, innocent app as a result, leaving it 1-star reviews and accusing it of being malware.
Google Chrome’s iOS app is testing a feature that would lock your Incognito tabs with either Touch ID or Face ID to add more security to the browser app.
Google Fi VPN for Android exits beta and expands to iPhone. The VPN app, designed for Google Fi users, is meant to encrypt connections when on public Wi-Fi networks or when using sites that don’t encrypt data. Users, however, question the privacy offered by VPN from Google.
Twitter said the iOS 14 privacy update will have a “modest impact” on its revenue. The companies joins others, including Facebook and Snap, in saying that Apple is impacting their business’s monetization.
Funding and M&A
Quilt, a “Clubhouse” focused self-care, raised $3.5 million seed round led by Mayfield Fund. The app has a similar format to audio social network, Clubhouse, but rooms are dedicated less to hustle culture and more to wellness, personal development, spirituality, meditation, astrology and more.
Match Group,owner of dating apps like Match and Tinder,will buy Korean social media company Hyperconnect for $1.73 billion. The company runs two apps, Azar and Hakuna Live, both which focus on video, including video chats and live broadcasts.
Electronic Arts buys Glu Mobile, maker of the “Kim Kardashian: Hollywood” mobile game in a $2.4 billion deal. The all-cash deal will also bring other games, like “Diner Dash” and “MLB Tap Sports Baseball” to EA, which said it made the acquisition because mobile is the “fastest-growing platform on the planet.”
French startup Powder raised $12 million for its social app for sharing clips from your favorite games, and follow others with the same interests. The app can capture video content from both desktop and mobile games.
Reddit’s valuation doubled to $6 billion after raising $250 million in a late-stage funding round led by Vy Capital, following the r/WallStreetBets and GameStop frenzy. The company was previously valued at $3 billion, and is also backed by Andreessen Horowitz and Tencent Holdings Ltd.
SplashLearn raised $18 million for its game-based edtech platform. The startup offers math and reading courses for Pre-K through 5th grade, and over 4,000 games and interactive activities.
Goody raised $4 million for its mobile app that lets you send gifts to friends, family and other loved ones over a text message. The other user can then personalize the gift and share their address, if you don’t have that information.
VerSe Innovation, the Bangalore-based parent firm of news and entertainment app Dailyhunt and short video app Josh, a TikTok rival, raised over $100 million in Series H round led by Qatar Investment Authority and Glade Brook Capital Partners. The round turns the company into a unicorn.
Tickr, an app that lets U.K. consumers make financial investments based on their impact to society and the environment, raised $3.4 millionin a round led by Ada Ventures, a VC firm focused on impact startups.
Huuuge Inc., a developer of free-to-play mobile casino games, raised $445 million in its IPO in Warsaw, becoming Poland’s largest-ever gaming industry listing.
Uptime, an educational app that offers 5-minute bits of insight from top books and courses, raised a $16 million“seed” round led by Tesco CEO Sir Terry Leahy; entrepreneur and chairman of N Brown, David Alliance; and members of private equity firm Thomas H Lee.
Modern Health, a mental health services provider for businesses to offer to their employees, raised $74 million, valuing its business at $1.17 billion. The Modern Health mobile app assesses each employee’s need and then provide care options.
Scalarr raised $7.5 million to fight mobile ad fraud. The company offers products to detect ad fraud before an advertiser bids and other tools used by ad exchanges, demand-side platforms, and supply-side platforms.
Dublin-based food ordering app Flipdish, a Deliveroo rival, raised €40 millionfrom global investment firm Tiger Global Management. The app offers a lower commission than other delivery rivals and is even testing drone delivery with startup Manna Aero.
Jackpot, an NYC-based lottery ticket app, raised $50 million Series C. The app allows users to play the lottery games in nine different states, including Arkansas, Colorado, Minnesota, New Hampshire, New Jersey, New York, Ohio, Oregon, Texas and Washington, D.C.
Downloads
Insight’s iOS web browser supports “extensions”
Image Credits: Insight
A new startup called Insight is bringing web browser extensions to the iPhone, with the goal of delivering a better web browsing experience by blocking ads and trackers, flagging fake reviews on Amazon, offering SEO-free search experiences or even calling out media bias and misinformation, among other things. These features are made available by way of the browser’s “extensions,” which work by way of a “sub-tab” workflow where you navigate using swiping gestures. For example, when online shopping, you could view the product you’re interested in, then swipe over to see the available coupons, the trusted product reviews or to comparison shop across other sites.
App Annie’s new app Pulse is aimed not at the more advanced analyst or marketer immersed in data, but rather at the executive who wants a “more elevated, top-down view” of the app ecosystem, TechCrunch reported. The app offers easy access to the app stores’ top charts, plus tools for tracking apps, and a news feed highlighting recent trends. Another feature, the App Annie Performance score, which aims to distill user acquisition, engagement, monetization and sentiment into a single benchmark.
Sat Feb 13 2021 15:24:35 GMT+0700 (Western Indonesia Time)
About a decade ago, I remember having a conversation with a friend about big data. At the time, we both agreed that it was the purview of large companies like Facebook, Yahoo and Google, and not something most companies would have to worry about.
As it turned out, we were both wrong. Within a short time, everyone would be dealing with big data. In fact, it turns out that huge amounts of data are the fuel of machine learning applications, something my friend and I didn’t foresee.
Frameworks were already emerging like Hadoop and Spark and concepts like the data warehouses were evolving. This was fine when it involved structured data like credit card info, but data warehouses weren’t designed for unstructured data you needed to build machine learning algorithms, and the concept of the data lake developed as a way to take unprocessed data and store until needed. It wasn’t sitting neatly in shelves in warehouses all labeled and organized, it was more amorphous and raw.
Over time, this idea caught the attention of the cloud vendors like Amazon, Microsoft and Google. What’s more, it caught the attention of investors as companies like Snowflake and Databricks built substantial companies on the data lake concept.
Even as that was happening startup founders began to identify other adjacent problems to attack like moving data into the data lake, cleaning it, processing it and funneling to applications and algorithms that could actually make use of that data. As this was happening, data science advanced outside of academia and became more mainstream inside businesses.
At that point there was a whole new modern ecosystem and when something like that happens, ideas develop, companies are built and investors come. We spoke to nine investors about the data lake idea and why they are so intrigued by it, the role of the cloud companies in this space, how an investor finds new companies in a maturing market and where the opportunities and challenges are in this lucrative area.
To learn about all of this, we queried the following investors:
Where are the opportunities for startups in the data lakes space with players like Snowflake and the cloud infrastructure vendors so firmly established?
Caryn Marooney: The data market is very large, driven by the opportunity to unlock value through digital transformation. Both the data lake and data warehouse architectures will be important over the long term because they solve different needs.
For established companies (think big banks, large brands) with significant existing data infrastructure, moving all their data to a data warehouse can be expensive and time consuming. For these companies, the data lake can be a good solution because it enables optionality and federated queries across data sources.
Dharmesh Thakker: Databricks (which Battery has invested in) and Snowflake have certainly become household names in the data lake and warehouse markets, respectively. But technical requirements and business needs are constantly shifting in these markets — and it’s important for both companies to continue to invest aggressively to maintain a competitive edge. They will have to keep innovating to continue to succeed.
Regardless of how this plays out, we feel excited about the ecosystem that’s emerging around these players (and others) given the massive data sprawl that’s occurring across cloud and on-premise workloads, and around a variety of data-storage vendors. We think there is a significant opportunity for vendors to continue to emerge as “unification layers” between data sources and different types of end users (including data scientists, data engineers, business analysts and others) in the form of integration middleware (cloud ELT vendors); real-time streaming and analytics; data governance and management; data security; and data monitoring. These markets shouldn’t be underestimated.
Casey Aylward: There are a handful of big opportunities in the data lake space even with many established cloud infrastructure players in the space:
Business intelligence/analytics/SQL may end up converging with machine learning/code like Scala or Python in certain products, but these domains have different end users and communities, programming language preferences and technical skills. Generally, architectural lock-ins are a big point of fear within core infrastructure. This is true for end users with their cloud providers, storage solutions, compute engines, etc. Solutions will be heterogeneous because of that and technology that enables this flexibility will be important.
As data moves around today, it is being reprocessed in each platform, which at scale is inefficient and expensive. There is an opportunity to build technology that allows users to move data around without rewriting transformations, data pipelines and stored procedures.
Finally, we’re seeing more traction around general data processing frameworks that are not MapReduce under the hood, especially in the Python data science ecosystem. This is a transition from Hadoop or even Spark, since they aren’t always best suited for unstructured, more modern algorithms.
Sat Feb 13 2021 12:30:47 GMT+0700 (Western Indonesia Time)
We surveyed five investors from the Brussels, Belgium ecosystem, and overall the mood was upbeat.
Investors are backing companies in smart living, life sciences (“a really promising sector for Belgium”), B2B, “industry 4.0,” fintech, mobility, health and music tech. Food tech appears “an overcrowded space.” Another says: “COVID confirmed our strategy to invest in local companies and with a sector focus on smart living life science and tech.”
Belgium has a “dynamic ecosystem of health actors, from biotech firms, universities and startups and scaleups. We follow the #BeHealth initiative, which unites the various parts of the Belgian health sector.”
Belgium is “not a market for B2C startups” as it has a “small but complex market with different regions/cultures/languages.” They are focusing on Belgium and neighboring countries for investing.
However, finding funding for startups is still a “difficult task today” said one, as it suffers from a lack of “scale capital” for later rounds.
How should investors in other cities think about the overall investment climate and opportunities in the city? “As a well-educated environment, multicultural, multilingual,” says one. “The ecosystem is very dynamic, with great opportunities. While valuations are usually lower compared to other hubs in Europe, there is quite some money available on the market,” says another.
Brussels’ geography makes it “very well-connected to Europe and international by nature.” It is multicultural and multilingual, so as a result startups position themselves for international expansion, “whether first to France or the Netherlands or beyond. For investors that are scoping opportunities in Belgium, they should recognize that Belgian startups are well-suited for international growth.”
As a small and very dense country, Belgium “already has a distributed founder geography.”
Investors have also been advising companies “to make sure that they have enough cash to last until the end of next 2021 at least.”
What trends are you most excited about investing in, generally?
Fintech, insurtech
What are you looking for in your next investment, in general?
Outstanding team, big opportunity.
Xavier de Villepin, partner, TheClubDeal
What trends are you most excited about investing in, generally?
Smart living, life sciences and tech.
What’s your latest, most exciting investment?
Univercells — Series C.
Are there startups that you wish you would see in the industry but don’t? What are some overlooked opportunities right now?
More startups needed in the smart living sector. In general, companies with international ambitions maintaining local sticky jobs.
What are you looking for in your next investment, in general?
Daring entrepreneurs within growing markets.
Which areas are either oversaturated or would be too hard to compete in at this point for a new startup? What other types of products/services are you wary or concerned about?
We are wary of blockchain and crypto currencies.
How much are you focused on investing in your local ecosystem versus other startup hubs (or everywhere) in general? More than 50%? Less?
More than 50%.
Which industries in your city and region seem well-positioned to thrive, or not, long term? What are companies you are excited about (your portfolio or not), which founders?
Life sciences, including biotech, is a really promising sector for Belgium. On the contrary, Belgium is not a market for B2C startups (small but complex market with different regions/cultures/languages).
How should investors in other cities think about the overall investment climate and opportunities in your city?
They feel Brussels is one of the main tech hubs in Belgium. Though the private equity and risk-on mentality is still not here. Finding funding for startups is still a difficult task today.
Do you expect to see a surge in more founders coming from geographies outside major cities in the years to come, with startup hubs losing people due to the pandemic and lingering concerns, plus the attraction of remote work?
I don’t think it will have a substantial impact, as many startups were already favoring remote work and flexible working hours.
Which industry segments that you invest in look weaker or more exposed to potential shifts in consumer and business behavior because of COVID-19?
Definitely travel and hospitality (part of smart living). It suffered a lot. But it’s a good time to invest. It’s an opportunity for startups to rethink their model and challenge the way they were seeing things before.
How has COVID-19 impacted your investment strategy? What are the biggest worries of the founders in your portfolio? What is your advice to startups in your portfolio right now?
COVID-19 confirmed our strategy was right … to focus on local competitiveness in the backbones of our economy: smart living, life sciences and tech. But within each sector, each company may be impacted differently. So a case-by-case analysis and in-depth due diligence is a necessity more than ever. Our advice to startups is to consider this environment will stay for another year and to plan the cash flows very carefully.
What is a moment that has given you hope in the last month or so? This can be professional, personal or a mix of the two.
The last lockdown giving much more freedom to companies to continue to operate and witness that many of them adapted their way of working to stay operational.
Frederic Convent, partner, TheClubDeal
What trends are you most excited about investing in, generally?
Smart living, life sciences, tech.
What’s your latest, most exciting investment? Univercells Series C.
What are you looking for in your next investment, in general?
More companies active in smart living, life sciences and tech.
Which areas are either oversaturated or would be too hard to compete in at this point for a new startup? What other types of products/services are you wary or concerned about?
Blockchain and crypto.
How much are you focused on investing in your local ecosystem versus other startup hubs (or everywhere) in general? More than 50%? Less?
50%.
Which industries in your city and region seem well-positioned to thrive, or not, long term? What are companies you are excited about (your portfolio or not), which founders?
Fintech is doing well in Brussels. We like an Antwerp mortgage B2B fintech: Oper.
How should investors in other cities think about the overall investment climate and opportunities in your city?
As a well-educated multicultural, multilingual environment.
Do you expect to see a surge in more founders coming from geographies outside major cities in the years to come, with startup hubs losing people due to the pandemic and lingering concerns, plus the attraction of remote work?
Most startups are already used to working remotely so the impact for the hubs is less, as they and their clients proved able to work elsewhere.
Which industry segments that you invest in look weaker or more exposed to potential shifts in consumer and business behavior because of COVID-19?
Travel and hospitality will suffer a lot in this COVID crisis. Life sciences are well-positioned to address the crisis.
How has COVID-19 impacted your investment strategy? What are the biggest worries of the founders in your portfolio? What is your advice to startups in your portfolio right now?
COVID confirmed our strategy to invest in local companies and with a sector focus on smart living, life sciences and tech.
Are you seeing “green shoots” regarding revenue growth, retention or other momentum in your portfolio as they adapt to the pandemic?
In medtech, essential medical intervention some green shoots benefit from the crisis.
What is a moment that has given you hope in the last month or so? This can be professional, personal or a mix of the two.
The last lockdown pushed companies to adapt their business model and to focus on the new situation.
Alexandre Dutoit, partner, ScaleFund
What trends are you most excited about investing in, generally?
We aim at bridging the equity gap between seed rounds and Series A.
What’s your latest, most exciting investment?
Kaspard, a silver economy company having developed a fall-detection technology.
Are there startups that you wish you would see in the industry but don’t? What are some overlooked opportunities right now?
We like B2B. Industry 4.0 type of deals lack a bit in our opinion.
What are you looking for in your next investment, in general?
Above all, we need a great team. Then we want to see some commercial traction, being POCs, first contracts.
Which areas are either oversaturated or would be too hard to compete in at this point for a new startup? What other types of products/services are you wary or concerned about?
Food tech appears to us as an overcrowded space. A lot of B2C entrepreneurs are doing “more of the same.”
How much are you focused on investing in your local ecosystem versus other startup hubs (or everywhere) in general? More than 50%? Less?
We focus on Belgium and neighboring countries.
Which industries in your city and region seem well-positioned to thrive, or not, long term? What are companies you are excited about (your portfolio or not), which founders?
Biotech is definitely a hit in Belgium. Fintech and music tech are also growing.
How should investors in other cities think about the overall investment climate and opportunities in your city?
The ecosystem is very dynamic, with great opportunities. While valuations are usually lower compared to other hubs in Europe, there is quite some money available on the market.
Do you expect to see a surge in more founders coming from geographies outside major cities in the years to come, with startup hubs losing people due to the pandemic and lingering concerns, plus the attraction of remote work?
I don’t see that coming, especially as entrepreneurs like to network, share experiences and be in an emulative environment.
Which industry segments that you invest in look weaker or more exposed to potential shifts in consumer and business behavior because of COVID-19? What are the opportunities startups may be able to tap into during these unprecedented times?
Very few, as great teams are able to adapt. We have in our portfolio a company closely tied to events that has been able to rethink its business model and is now even more profitable compared to before the crises. Besides, companies that foster remote work or can install service at a distance will be short-term winners.
How has COVID-19 impacted your investment strategy? What are the biggest worries of the founders in your portfolio? What is your advice to startups in your portfolio right now?
COVID has not impacted our strategy. Entrepreneurs are afraid of the uncertainty and lack of perspective. We encourage them to prepare themselves for the next opened window and to work on tech and processes, while reassuring them on the financing side.
Are you seeing “green shoots” regarding revenue growth, retention or other momentum in your portfolio as they adapt to the pandemic?
Utopix, a startup linked to the event industry, has been able to rethink its business model as their sales were falling down. They have down their best month ever since then.
What is a moment that has given you hope in the last month or so? This can be professional, personal or a mix of the two.
I have seen hope after the summer period when companies were angry to do business again. Unfortunately, that hasn’t lasted very long. We try to remain positive and focus on important things.
Any other thoughts you want to share with TechCrunch readers?
Brussels is a growing scene for startups, very well-connected to Europe and international by nature.
Olivier de Duve, partner, Inventures Investment Partners
What trends are you most excited about investing in, generally?
At Inventures, we invest in a range of startups that have strong financial returns and a measurable social and environmental impact. Looking to 2021, we’re most excited about the mobility sector, HR tech, the blue economy (investing in technologies around water and ocean health) and the circular economy. These sectors started to grow rapidly in Europe, and we’re excited to source some great deals in the coming year.
What’s your latest, most exciting investment?
We just led a round in MySkillCamp, a Belgian HR tech company that equips SMEs and corporates with an adaptable platform for employee learning. MySkillCamp has been stunning us with their rapid growth, even during the pandemic, and it’s a testament to the fact that companies need solutions for upskilling and reskilling their workforce.
Are there startups that you wish you would see in the industry but don’t? What are some overlooked opportunities right now?
I’ll flip this question to be investor-centric. We’d really like to see more impact venture capital firms that are active in the Series B and beyond stage in Europe. For now, the largest impact VCs are concentrated in the US — having that source of capital here in Brussels or in neighboring ecosystems will help earlier-stage European VCs continue to scale and support their portfolio companies in later rounds. Having that access to capital is key for making a sustainable ecosystem.
What are you looking for in your next investment, in general?
Our investment thesis is to find startups that are financially strong and tackle one of the 17 United Nations Sustainable Development Goals (SDGs). Broadly that has meant companies in health, mobility, renewable energy, climate and more. As we’re rounding out our second fund, our next investment has to hit our sweet spot of clear commercial traction, a stellar team and solid plans for scaling internationally.
Which areas are either oversaturated or would be too hard to compete in at this point for a new startup? What other types of products/services are you wary or concerned about?
Several markets are oversaturated like shared light vehicle scooters or telemedicine solutions. D2C medical devices is also a tough market to break into. Given the pandemic situation, startups active in the recreational sector like tourism and sport are struggling more than ever. All products or services that are not digital are less resilient and will need to shift as soon as possible.
How much are you focused on investing in your local ecosystem versus other startup hubs (or everywhere) in general? More than 50%? Less?
About half of our startups are coming from Belgium. We’ve historically invested in the U.K., France, the Netherlands and Luxembourg, however we’re open to investing across the EU.
Which industries in your city and region seem well-positioned to thrive, or not, long term? What are companies you are excited about (your portfolio or not), which founders?
Two sectors that come to mind are mobility and health. Belgium is a hyperconnected country, and mobility startups that address user needs for a more sustainable and efficient transportation will do well here. As for health, Belgium has a dynamic ecosystem of health actors, from biotech firms, universities, and startups and scaleups. We follow the #BeHealth initiative, which unites the various parts of the Belgian health sector. One company that we wanted to highlight is Citizen Lab — they are a digital democracy platform that helps local governments organize voting, participatory budgeting and more. They’re setting the conversation around civic tech and we’re so excited to see what the founders Wietse Van Ransbeeck and Aline Muylaert have in store for 2021.
How should investors in other cities think about the overall investment climate and opportunities in your city?
Belgium is a multicultural, multilingual country — so startups that are grown here naturally are positioning themselves for international expansion, whether first to France or the Netherlands or beyond. For investors that are scoping opportunities in Belgium, they should recognize that Belgian startups are well-suited for international growth and a role that they could play as investors is helping to introduce Belgian startups to other markets.
Do you expect to see a surge in more founders coming from geographies outside major cities in the years to come, with startup hubs losing people due to the pandemic and lingering concerns, plus the attraction of remote work?
As a small and very dense country, Belgium already has a distributed founder geography. In Brussels we have Co.Station, which is home to dozens of startups. However, we also see strong growth in innovation coming from Leuven, Ghent, Antwerp, Liege — and these cities are maximum two hours away by train. Our latest investment, MySkillCamp, for example, is based in Tournai, with an office in Brussels.
Which industry segments that you invest in look weaker or more exposed to potential shifts in consumer and business behavior because of COVID-19? What are the opportunities startups may be able to tap into during these unprecedented times?
We found out in our portfolio that companies are quite resilient to the crisis because they are addressing societal issues like health, climate and energy. SaaS companies or other digital services are also less exposed, which points out that digitalization is key to survive. Companies that are highly dependent on large governmental contracts could be more exposed to shifts in spending patterns due to COVID.
How has COVID-19 impacted your investment strategy? What are the biggest worries of the founders in your portfolio? What is your advice to startups in your portfolio right now?
COVID-19 has not impacted our investment strategy so much as our post-investment strategy. Since the pandemic started, we’ve been “all hands on deck” with helping our portfolio companies weather the storm — from organizing new fundraising to scoping out new markets and helping on strategic growth projects. We’ve been advising our companies to make sure that they have enough cash to last until the end of next 2021 at least. What we’re seeing is that contracts are taking longer to be signed, especially for our companies looking to partner with governments that are more cash strapped and limited because of the pandemic.
Are you seeing “green shoots” regarding revenue growth, retention or other momentum in your portfolio as they adapt to the pandemic?
Definitely! On the ecosystem level, we’ve seen a lot of fundraising activity in the last six months, particularly in the health and biotech sector — one example of that is Belgium-based Univercells. For our portfolio, we’ve seen that tools that serve governments and the transition to a more digital economy has created enormous opportunities for our B2B and B2G companies to thrive during this time.
What is a moment that has given you hope in the last month or so? This can be professional, personal or a mix of the two.
A few moments have given us hope during 2020. Seeing the racial reckoning in the U.S. spark conversations in Europe about justice and D&I has given me a lot of hope around the role of the venture capital and startup sector in creating a more equal society. Initiatives like Diversity VC are helping us to do that. Also, the sheer number of startups with climate benefits, from cultured meat to sustainable packaging and more, has showcased the financial viability and the demand for expanding the world’s options for sustainability — another large societal challenge.
Any other thoughts you want to share with TechCrunch readers?
Belgium is home to a vibrant, active and fast-growing startup scene!
Sat Feb 13 2021 10:22:00 GMT+0700 (Western Indonesia Time)
Do you need to access Network Adapter information from you Delphi applications? Detecting the available network Adapters information is no more a challenging task. MiTec’s System Information Management Suite’s component helps to detect easily the network adapters and we will learn how to use TMiTeC_Network and TMiTeC_TCPIP component in this blog post.
Platforms: Windows.
Installation Steps:
You can easily install this Component Suite from GetIt Package Manager. The steps are as follows.
Navigate In RAD Studio IDE->Tools->GetIt Package Manager->select Components in Categories->Components->Trail -MiTec system Information Component Suite 14.3 and click Install Button.
Read the license and Click Agree All. An Information dialog saying ‘Requires a restart of RAD studio at the end of the process. Do you want to proceed? click yes and continue.
It will download the plugin and installs it. Once installed Click Restart now.
How to run the Demo app:
Navigate to the System Information Management Suite trails setup, Demos folder which is installed during Get It installation e.g) C:UsersDocumentsEmbarcaderoStudio21.0CatalogRepositoryMiTeC-14.3DemosDelphi17
Open the IntfList project in RAD studio 10.4.1 compile and Run the application.
This Demo App shows how to detect the Network Adapters and its properties such as Interface, IPAddress, MACAddress etc.
Components used in MSIC IntfList Demo App:
TMiTeC_Network Properties
TMiTeC_Network: Retrieves network environment information. Using this component, we can access Network resources and WinSock properties.
TMiTeC_TCPIP: Enumerates network adapters, their properties and network configuration.
TListView To list down the list of detected TCPIP Network Adapters.
Implementation Details:
An instance FNetwork of TMiTeC_Network is created. Loop through the TCPIP.AdapterCount property to detect the available network adapters. For each TCPIP.Adpater record list down the properties such as Interface Name, IPAddress, IPAddressMask, Address, Typ, OperStatus, AdminStatus, Speed in the list view.
procedure TwndMain.RefreshData;
var
i: Integer;
begin
FNetwork.RefreshData;
List.Items.BeginUpdate;
try
List.Items.Clear;
for i:=0 to FNetwork.TCPIP.AdapterCount-1 do
with List.Items.Add do begin
Caption:=FNetwork.TCPIP.Adapter[i].Name;
SubItems.Add(FNetwork.TCPIP.Adapter[i].IPAddress.CommaText);
SubItems.Add(FNetwork.TCPIP.Adapter[i].IPAddressMask.CommaText);
SubItems.Add(FNetwork.TCPIP.Adapter[i].Address);
SubItems.Add(AdapterTypes[FNetwork.TCPIP.Adapter[i].Typ]);
SubItems.Add(GetIntfStatStr(FNetwork.TCPIP.Adapter[i].OperStatus));
SubItems.Add(GetIntfAdminStr(FNetwork.TCPIP.Adapter[i].AdminStatus));
SubItems.Add(IntToStr(FNetwork.TCPIP.Adapter[i].MaxSpeed div 1000000));
SubItems.Add(IntToStr(FNetwork.TCPIP.Adapter[i].MTU));
if FNetwork.TCPIP.BestInterfaceIdx=FNetwork.TCPIP.Adapter[i].IntfIdx then
ImageIndex:=0
else
ImageIndex:=-1;
end;
finally
List.Items.EndUpdate;
end;
end;
MiTeC_Network Demo
On Double clicking a selected row, the interface properties were shown in the child form.
procedure ShowIntfProps(Adapter: TAdapter);
begin
dlgIntf:=TdlgIntf.Create(Application.Mainform);
with dlgIntf do
try
Caption:=Adapter.Name;
with List.Items.Add do begin
Caption:='Description';
SubItems.Add(Adapter.Name);
end;
with List.Items.Add do begin
Caption:='Alias';
SubItems.Add(Adapter.Alias);
end;
with List.Items.Add do begin
Caption:='MAC Address';
SubItems.Add(Adapter.Address);
end;
with List.Items.Add do begin
Caption:='MTU';
SubItems.Add(IntToStr(Adapter.MTU));
end;
with List.Items.Add do begin
Caption:='Link speed';
SubItems.Add(Format('%d Mbps',[Adapter.MaxSpeed div 1000000]));
end;
with List.Items.Add do begin
Caption:='Type';
SubItems.Add(AdapterTypes[Adapter.Typ]);
end;
with List.Items.Add do begin
Caption:='DNS connection suffix';
SubItems.Add(Adapter.DNSSuffix);
end;
with List.Items.Add do begin
Caption:='DHCP Enabled';
SubItems.Add(BoolToStr(Adapter.EnableDHCP,True));
end;
with List.Items.Add do begin
Caption:='IPv4';
SubItems.Add(Adapter.IPAddress.CommaText);
end;
with List.Items.Add do begin
Caption:='IPv4 Mask';
SubItems.Add(Adapter.IPAddressMask.CommaText);
end;
with List.Items.Add do begin
Caption:='IPv4 DHCP Servers';
SubItems.Add(Adapter.DHCP_IPAddress.CommaText);
end;
with List.Items.Add do begin
Caption:='IPv4 Default Gateway';
SubItems.Add(Adapter.Gateway_IPAddress.CommaText);
end;
with List.Items.Add do begin
Caption:='IPv4 DNS Servers';
SubItems.Add(Adapter.DNSServers.CommaText);
end;
with List.Items.Add do begin
Caption:='IPv4 WINS Servers';
SubItems.Add(Adapter.PrimaryWINS_IPAddress.CommaText);
end;
with List.Items.Add do begin
Caption:='IPv6';
SubItems.Add(Adapter.IPv6Address.CommaText);
end;
with List.Items.Add do begin
Caption:='IPv6 DHCP Servers';
SubItems.Add(Adapter.DHCP_IPv6.CommaText);
end;
with List.Items.Add do begin
Caption:='IPv6 Default Gateway';
SubItems.Add(Adapter.Gateway_IPv6.CommaText);
end;
with List.Items.Add do begin
Caption:='IPv6 DNS Servers';
SubItems.Add(Adapter.DNSServers_IPv6.CommaText);
end;
with List.Items.Add do begin
Caption:='IPv6 WINS Servers';
SubItems.Add(Adapter.PrimaryWINS_IPv6.CommaText);
end;
ShowModal;
finally
Free;
end;
end;
Network Ethernet Adapter Property
It’s that simple to enumerate list of network adapters and its properties available in your machine from your Delphi application. Use this MiTeC component suite and get the job done quickly.
Sat Feb 13 2021 02:00:00 GMT+0700 (Western Indonesia Time)
LED Scrollerは、画面上でテキストと絵文字を簡単かつ便利にスクロール表示できるアプリで、Delphiによって開発されました。このアプリには多くの機能がありますが、完全に無料で利用できます。LED Scrollerを用いれば、任意のテキストと絵文字を任意のフォントで入力(アプリはデバイスのデフォルトフォントを使用)し、テキストと絵文字のサイズと色を変更できます。ユーザーは、LED Scrollerを使用することで、興味を引くバナーやメッセージを作成することができます。これは、強力でありながら複雑性を排した、Delphiによって構築されたAndroidアプリの好例です。このようなアプリは、クロスプラットフォーム開発で利用されるDelphi FireMonkeyの生産性の高さが発揮されるところです。
Sat Feb 13 2021 00:47:09 GMT+0700 (Western Indonesia Time)
I’m very proud of the work we’re doing here at Extra Crunch, so it gives me great pleasure to announce that today is our second anniversary.
Thanks to hard work from the entire TechCrunch team, authoritative guest contributors and a very engaged reader base, we’ve tripled our membership in the last 12 months.
As Extra Crunch enters its third year, we’re putting our foot on the gas in 2021 so we can bring you more:
Fresh analysis about today’s most dynamic tech industries.
Full Extra Crunch articles are only available to members Use discount code ECFriday to save 20% off a one- or two-year subscription
To be completely honest: Eric and I wavered about posting this announcement. Both of us would prefer to show the results of our work than make a list of future-looking statements, so I’ll sum up:
I’m proud of the work we’re doing because people around the world use the information they find on Extra Crunch to build and grow companies. That’s big!
Thanks very much for reading Extra Crunch; have a great weekend.
Before the pandemic began, I took about seven or eight hailed rides each month. Since I began physically distancing from others to stem the spread of the coronavirus in March 2020, I’ve taken exactly 10 hailed rides.
Your mileage may vary, but last year, Uber and Lyft both reported steep revenue losses as travelers hunkered down at home. Today, Alex Wilhelm says both transportation platforms plan to reach adjusted profitability by Q4 2021.
He unpacked the numbers “to see if what the two companies are dangling in front of investors is worth desiring.” Since he usually doesn’t focus on publicly traded stocks, I asked Alex why he focused on Uber and Lyft today.
“Utter confusion,” he replied.
“Investors have bid up their stocks like the two companies are crushing the game, instead of playing a game with their numbers to reach some sort of profit in the future,” Alex explained. “The stock market makes no sense, but this is one of the weirder things.”
In the theater, a “four-hander” is a play that was written for four actors.
Today, I’m appropriating the term to describe this roundup by Greg Kumparak, Natasha Mascarenhas, Alex Wilhelm and Jonathan Shieber that recaps their favorite startups from Techstars accelerators.
“As always, these are just our favorites, but don’t just take our word for it. Dig into the pitches yourself, as there’s never a bad time to check out some super-early-stage startups.”
Neoinsurance company Metromile began trading publicly this week after it combined with a special purpose acquisition company.
Metromile will likely be one of 2021’s many SPAC-led debuts, so Alex interviewed CEO Dan Preston to learn more about the process and what he learned along the way.
A notable takeaway: “Preston said SPACs are designed for a specific class of company; namely those that want or need to share a bit more story when they go public.”
I have a hard time envisioning all of the hurdles deep tech founders must overcome before they can land their first paying customer.
How do you sustainably scale a company that probably doesn’t have revenue and isn’t likely to for the foreseeable future? How big is the TAM for an unproven product in a marketplace that’s still taking shape?
Vin Lingathoti, a partner at Cambridge Innovation Capital, says entrepreneurs operating in this space face a unique set of challenges when it comes to managing growth and risk.
“Often these founders with Ph.D.s and postdocs find it hard to accept their weaknesses, especially in nontechnical areas such as marketing, sales, HR, etc.,” says Lingathoti.
This week, auto insurance startup Metromile completed its combination with SPAC INSU Acquisition Corp. II.
Last Friday, health insurance company Oscar Health announced its plans to launch an initial public offering.
As the saying goes: Past performance is no guarantee of future results, but using 2020 debuts by neoinsurance firms Lemonade and Root as a reference point, Alex says the IPO window is wide open for other players in the space.
“All the companies in our group are pretty good at adding customers to their businesses,” he found.
Dear Sophie: How can I improve our startup’s international recruiting?
Image Credits: Bryce Durbin/TechCrunch
Dear Sophie:
We’ve been having a tough time filling vacant engineering and other positions at our company and are planning to make a more concerted effort to recruit internationally.
The people who produce viral TikTok duets, in-demand Substack newsletters and popular YouTube channels are doing what they love. And the money is following them.
Many of these emerging stars have become media personalities with full-fledged production and distribution teams, giving rise to what one investor described as “the enterprise layer of the creator economy.”
More VCs are backing startups that help these digital creators monetize, produce, analyze and distribute content.
Natasha Mascarenhas and Alex Wilhelm interviewed five of them to learn more about the opportunities they’re tracking in 2021:
Benjamin Grubbs, founder, Next10 Ventures
Li Jin, founder, Atelier Ventures
Brian O’Malley, general partner, Forerunner Ventures
Simple agreements for future equity are an increasingly popular way for startups to raise funds quickly, but “they don’t generate the same paperwork exhaust,” Alex Wilhelm noted this week.
This creates cognitive dissonance: Investors see a hot market, while people who rely on public data (like journalists) get a different picture.
“SAFEs have effectively pushed a lot of public signal regarding seed deals, and even smaller rounds, underground,” says Alex.
Container security acquisitions increase as companies accelerate shift to cloud
Image Credits: Andriy Onufriyenko / Getty Images
Many enterprise companies were snapping up container security startups before the pandemic began, but the pace has picked up, reports Ron Miller.
The growing number of companies going cloud-native is creating security challenges; the containers that package microservices must be correctly configured and secured, which can get complicated quickly.
“The acquisitions we are seeing now are filling gaps in the portfolio of security capabilities offered by the larger companies,” says Yoav Leitersdorf, managing partner at YL Ventures.
Dating platform Bumble initially set a price of $28 to $30 for its upcoming IPO, but at its new range of $37 to $39, Alex calculated that it could reach a max valuation of $7.4 billion to $7.8 billion.
Although the health insurance company claims 529,000 members and a compound annual growth rate of 59%, “it’s a deeply unprofitable enterprise,” they found.
Jon and Alex parsed Oscar Health’s 2019 comps and its 2020 metrics to take a closer look at the company’s performance.
“Both Oscar and the high-profile SPAC for Clover Medical will prove to be a test for the venture capital industry’s faith in their ability to disrupt traditional healthcare companies,” they write.
Managing Editor Danny Crichton filed a column about Softbank’s Vision Fund that tried to answer a question he asked in 2017: “What does a return profile look like at such a late stage of investment?”
Softbank’s recent earnings report shows that its $680 million bet on DoorDash paid off handsomely, bringing back $9 billion. Compared to its competition, “the fund is actually doing quite decent right now,” he wrote. But Softbank has invested $66 billion in 74 unexited 74 companies that are worth $65.2 billion today.
“SoftBank quietly chopped half of the performance fees for its VC managers, from $5B to $2.5B, which led us to ask: are the best investments in the fund already in SoftBank’s rearview mirror? One upshot: WeWork seems to have turned something of a corner, with some improvements in its debt profile portending more positive news post-COVID-19.”
Sat Feb 13 2021 00:14:39 GMT+0700 (Western Indonesia Time)
In an episode of The Office, the character Kevin Malone famously opined: “Why waste time say lot word when few word do trick?” Indeed, language can be inefficient, leading to bloated and less-accurate natural language processing (NLP) models. This has given rise to attention mechanisms, which help NLP models identify key words, in popular models like OpenAI’s GPT-3. These tools are now also at the heart of MIT’s new “SpAtten” model, a combined hardware-software system for streamlining NLP through a robust attention mechanism.
The most powerful NLP models are robust, but come at extraordinary computational expense. “This part is actually the bottleneck for NLP models,” said Hanrui Wang, a PhD candidate at MIT and lead author of the paper presenting SpAtten, in an interview with MIT’s Daniel Ackerman. “We need algorithmic optimizations and dedicated hardware to process the ever-increasing computational demand.
Enter SpAtten, which delivers both as a single, integrated platform. SpAtten, for instance, uses a technique called “cascade pruning” to jettison vestigial words – and all associated data work on those words – once key words are identified. SpAtten is also able to use lower-precision analysis for simpler sentences, only breaking out the big guns when faced with a complex sentence. And, on the hardware front, SpAtten is highly parallelized, allowing it to simultaneously assess every word in a given sentence. “Our system is similar to how the human brain processes language,” Wang said. “We read very fast and just focus on key words. That’s the idea with SpAtten.”
For now, SpAtten’s hardware only exists in simulations, but in those simulations, it performed over a hundred times faster than an Nvidia Titan Xp GPU (the next fastest hardware tested) and, according to MIT, a thousand times more efficiently. Combined, the speed and efficiency advantages have serious implications for reducing the energy demands of advanced NLP models in the future – assuming SpAtten’s hardware performs similarly in real life.
“Our vision for the future is that new algorithms and hardware that remove the redundancy in languages will reduce cost and save on the power budget for data center NLP workloads,” said Wang, who went on to imagine the kinds of impacts that SpAtten-like technology could have on other major AI- and NLP-driven sectors. “We can improve the battery life for mobile phone or IoT devices. That’s especially important because in the future, numerous IoT devices will interact with humans by voice and natural language, so NLP will be the first application we want to employ.”
Fri Feb 12 2021 23:42:47 GMT+0700 (Western Indonesia Time)
Tony Florence isn’t as well known to the public as other top investors like Bill Gurley or Marc Andreessen, but he’s someone who founders with SaaS and especially marketplace e-commerce companies know — or should. He’s responsible for the global tech investing activities for NEA, one of the world’s biggest venture firms in terms of assets under management (it closed its newest fund with $3.6 billion last year).
Florence has also been involved with a long list of e-commerce brands to break through, including Jet, Gilt, Goop, Casper, Letgo, and Moda Operandi.
It’s because we talked earlier this week with one of his newer e-commerce bets, Maisonette, that we wanted to ask him about brand building more than a year into a pandemic that has changed the world in both fleeting and permanent ways. We wound up talking about how customer acquisition has changed; what he thinks of the growing number of companies trying to roll up third-party sellers on Amazon; and how upstarts can maintain momentum when even younger companies become a shiny new fascination for customers.
Note: one topic that he couldn’t and wouldn’t comment on is the future of one founder who Florence has backed twice, Marc Lore, who stepped down from Walmart last month to begin building what he recently told Vox is a multi-decade project to build “a city of the future.” (More on this to come, evidently.)
Part of our chat with Florence, lightly edited for length and clarity, follows:
TC: You’ve funded a number of very different businesses that have managed to grow even as Amazon has eaten up more of the retail market. Is there any sector or vertical you wouldn’t back because of the company?
TF: You have to be thoughtful about Amazon. I wouldn’t say there’s one particular area that you either can ignore or feel like you’re completely comfortable and open to, given the scale of their platform. At the same time, there are founding principles and fundamentals that we think about as they relate to companies being able to compete and operate successfully.
TC: And these are what? You’ve backed Marc Lore, Philip Krim (of Casper), Sylvana and Luisana of Maisonette. Do they have something in common?
TF: Sometimes [founders] come at the problem organically; they’re living it [and want to solve it]. Other times, somebody like Marc sees a business opportunity and just attacks it. But there are commonalities. These are folks who are very customer centric, who are focused on good, fundamental unit economics, and who are obsessive about their people, their teams. It takes a village to build a young successful company, and all of those founders you mentioned are great at recruiting world-class people. There’s a sense of vision and mission and culture.
When you wake up and decide to do something, the majority of people you talk to just want to tell you the reasons why it can’t work, so it also takes a certain [wherewithal] to have such conviction around what you’re doing that you’re kind of all in on it, and you’re going to break through no matter what.
TC: Maisonette was going to open a brick-and-mortar store but put a pin in that plan because of COVID. Will we go back to seeing direct-to-consumer brands opening real-world locations when this is over? Has the pandemic permanently changed that calculation?
TF: Leading up to the pandemic, a lot of the young DTC companies that were direct-to-consumer brands, and even the traditional e-commerce marketplaces, were experimenting with offline. Some of it was out of necessity, frankly. Sometimes [customer acquisition costs] became so expensive that it was actually cheaper for them to go offline. In other cases, it was done because the customer wanted that closed loop experience, as with [mattress maker] Casper.
A lot of companies [opened these stores] in a contained way and it worked really well. It’s very accretive financially to the overall business contribution, margin wise. It was accretive for the overall customer experience. And in many cases, it didn’t cannibalize anything. It just expanded the [total addressable market].
We’re spending a lot of time right now continuing to think through what are the permanent changes that are going to come out of the pandemic, but I would say the omnichannel model has really has started to take shape and succeed if you look at big retailers like Walmart and Target, so I think there will be an omnichannel dynamic to many of these companies that we’re talking about. Also, over the last 12 months, the cost of acquisition and the efficacy of marketing has swung back in the favor of these young companies. It’s improved to a point where we don’t really even need to think about offline.
TC: I know it had become expensive to acquire customers digitally because it was so crowded out there. Did it become less crowded?
TF: There were very few platforms that these companies could use pre pandemic that weren’t oversaturated . . . it was just very competitive, and that would bid up the cost of acquisition. In the last 12 months, you’ve seen big parts of that market go away. With airlines and financial services and a lot of the spend going way down, it’s become a lot cheaper for companies to market digitally.
TC: Still, it feels at times that it’s hard to maintain a brand’s momentum over time; there’s always some new outfit nipping at its heels. How does a brand keep itself fresh and relevant in 2021?
TF: There’s a hits dynamic — a fad dynamic — in the consumer space, so that’s always a challenge. You [compete by] continually reinventing and adding [to your offerings]. You see that in social categories, you see that in marketplaces [where they add] managed services and other components [like] payments, and you clearly see it in the way some of the direct-to-consumer companies continue to add new products to the mix.
You focus on the core aspects of your brand and its mission and vision and make sure that the customers really feel that. There’s a community dynamic that has really occurred the last four or five years around e-commerce companies. Glossier is a great example of a company that built a great community around a core set of product offerings, and that has really propelled that company beyond its core customer customer base.
There’s also a contextual commerce opportunity. Goop is a great example this; Gwyneth [Paltrow] brilliantly came up with [an effective way] to merge content and commerce, and that’s something a lot of companies in the commerce space have started to invest in.
TC: Content, community and not necessarily speed, so focusing on what Amazon does not. Can I ask: do you think Amazon needs to be reigned in?
TF: If you’re competing with them [in the] cloud market or a commerce market, they’re a very formidable competitor, and you got to take them very, very seriously. They’re at a scale that’s just incredibly impressive. But I do think you’re seeing a lot of innovation around the edges and companies finding areas that Amazon maybe can’t focus on or isn’t focusing on.
TC: What do you think of these Amazon Marketplace roll-ups that we’re seeing? There’s been at least a half of dozen of them already, including Thrasio, which announced $750 million this week. All are raising money hand over first.
TF: We haven’t made an investment in the area, though we’re watching very closely. It can be a very capital intensive strategy to execute on because you’re buying brands and then bringing them onto the platform to consolidate and grow, but there’s just an enormous long tail to the e-commerce space and this is an opportunity to consolidate that.
TC: Like, an infinite opportunity? How many roll-ups can the market support?
TFL I do think that we’ll see a handful of these companies get to decent scale. The question will be whether you’ve got more of an arbitrage going on [by] buying companies and generating synergies or there’s some fundamental bigger breakthrough. If you could use AI [and] machine learning to understand how to better serve customers and think about customer acquisition a little bit better, that would be really interesting. If there are real economies of scale to the supply chains [or] baseline infrastructure, that would certainly be interesting.
It’s early on. It remains to be seen how this is gonna play out.
Pictured above, left to right: NEA’s global managing director, Scott Sandell, and Florence, who is the head of global tech investing activities at NEA and who works alongside Mohamad Makhzoumi, who oversees the firm’s healthcare practice.
Fri Feb 12 2021 23:41:58 GMT+0700 (Western Indonesia Time)
Medecinum is a medical library and MCQ bank for medical students and professionals and it is powered by Delphi. According to the developer, “The aim of this app is to provide a quick reference and training resources for all students and practitioners of medicine, pharmacy and dentistry. The content of this app is updated and maintained by a qualified board of doctors. Currently, it is available only in French. It is developped using Delphi 10.3 Community Edition, and it is available with the same content, interface and style on Windows and Android. The developpement process of this application in Delphi was and still fluent. Designed with the Firemonkey framework and LiveBindings technology on the front-end, this app rely on FireDAC in memory datasets as back-end for loading and retrieving its data’s content. The wide sets of Delphi FMX’s features offer many possiblities for the developpement and the enhancement of Medecinum’s project.”
Best features:
More than 50,000 MCQs and clinical cases sorted by module, by course and by sources, from different faculties in Algeria and France.
More than 3,000 medical pathology monographs classified by specialty with a synthetic description easy to assimilate, with emphasis on the concepts of prevention, health education and therapeutic education.
Biological constant values and interpretations of different variations.
Forms to calculate the different indices and clinical scores with instant interpretation of the resulting values.
Fri Feb 12 2021 23:37:25 GMT+0700 (Western Indonesia Time)
A business management software, which has acquired capital expertise over the years is built in Delphi. Citra IT is used by more than 5,000 customers, which has allowed the company to position themselves as leaders in the industry. They have a number of different software offerings for managing businesses. On their site they list a number of features such as:
Barcode management Barcode generation and direct printing, package barcode, Multiple barcodes for one item, Barcode by size / color, Barcode by batch
Availability Actual stock, Available stock, Minimum stock, Alert stock, Average stock, Maximum and obsolete stock.
Batch management and expiration date Perfect batch management, output by expiration date, alert in the event of a batch close to the expiration date or expired.
Entrances and exits Entry voucher, Exit voucher, Reintegration voucher, Transfer voucher, Return voucher, Reject voucher
Import management Entry of receipts in Currency, calculation of cost price including charges (Customs clearance, Transport, Forwarder …).
Provider file Contact details, list of contacts, bank details, price by supplier, statistics by supplier family
Weight and volume Calculates total weight and volume when ordering and receiving, thus avoiding logistical problems
App assistant. Equipped with a procurement assistant to guarantee the availability of raw material
Fri Feb 12 2021 23:33:01 GMT+0700 (Western Indonesia Time)
This is a Travel & Tour application for Demo created using Delphi RAD Studio (Firemonkey). Apparently this is just a template that the developer created but it is still a nice showcase of the kinds of interfaces that can be built with FireMonkey for Android. What I like about this showcase is the variety of interface types across the different screens of the app. It demonstrates a significant number of different interfaces.
Fri Feb 12 2021 23:26:42 GMT+0700 (Western Indonesia Time)
The NuSOFT GAMWIN software is designed for comprehensive spectrum analysis and the assessment of the spectrometric data obtained from semiconductor or scintillation detectors and it is built in Delphi. According to the developer, “It supports variety of spectrum files format and includes user friendly tools for simple setup and calibration. Wide variety of spectral correction methods, comprehensive QA, reporting tools and fully managed nuclide libraries available in one package.” What I love about this showcase is that it is a testament to the longevity of Delphi and the Delphi ecosystem. We have modern screenshots here and also screenshots from older versions of Windows. Delphi delivers that futureproofing to your software development investment.
Fri Feb 12 2021 23:21:38 GMT+0700 (Western Indonesia Time)
Dealer RQ app is designed as a mobile station, customer control program, creation and renewal of objects, and viewing statistics for objects and it is built in Delphi. The interface is in Russian but it is a business automation app. The app itself is part of a larger system that the developer offers. According to the developer, “What do we know about the program r-keeper, aika, tilipad, 1C, restaurateur? We know that all these programs, in one way or another, serve to automate the business! Whether it’s a restaurant, catering, delivery. And rquest is no exception! We took the best of the software and combined it into a single product called rquest”
Fri Feb 12 2021 23:13:56 GMT+0700 (Western Indonesia Time)
MySQL Backup is a backup and restore MySQL databases app from an android device via the internet and the app is created in Delphi. It does not look like it is available via Google Play but via a third party Android store called SlideMe. It is compatible with MySQL Servers: 6.0, 5.6, 5.5, 5.1, 5.0, 4.1, 4.0, 3.23. Some of the features include:
Backup MySQL databases to the android device by directly connecting.
Restore MySQL databases.
Direct access to MySQL servers.
System Requirements: *ARMv7 CPU Based Android Device (99% android devices based on ARMv7) *Android OS: 4.1.2 or Later
Fri Feb 12 2021 23:10:51 GMT+0700 (Western Indonesia Time)
Jack Dorsey and Jay Z create a bitcoin endowment, Datadog acquires a Startup Battlefield company and BuzzFeed experiments with AI-generated quizzes. This is your Daily Crunch for February 12, 2021.
The big story: Jack Dorsey and Jay Z invest in bitcoin development
The Twitter founder and rapper/entrepreneur have put 500 bitcoin (currently worth more than $23 million) into an endowment called ₿trust, which Dorsey said is being set up as a blind trust.
He also said the endowment will focus initially on bitcoin development in Africa and India — India’s government has been reluctant to embrace cryptocurrencies thus far, while Africa (especially Nigeria) has had a surge in transactions.
A job description for ₿trust’s board members says that the organization’s mission is to “make bitcoin the internet’s currency.”
The Daily Crunch is TechCrunch’s roundup of our biggest and most important stories. If you’d like to get this delivered to your inbox every day at around 3pm Pacific, you can subscribe here.
Fri Feb 12 2021 23:07:00 GMT+0700 (Western Indonesia Time)
ALLPlayer Remote is an app that lets you monitor programs and transfer files between your mobile and PC and it is developed in Delphi. According to the developer, “Remote is fitted with all the required video player control keys, such as ALLPlayer, VLC or Windows Media Player. You can also use it to monitor popular video services like NETFLIX or YouTube. It is a remote controller for Android devices.” The developer goes on to say that, “ALLPlayer is the most popular program for watching movies with subtitles. It plays all formats of movies, and if there is a problem with opening the file, it updates the latest codecs. The program also automatically searches for matching subtitles in all languages.”
Fri Feb 12 2021 23:03:35 GMT+0700 (Western Indonesia Time)
ALLConverter is an easy drag and drop video and audio converter and it is powered by Delphi. According to the developer, “it is a video converter that converts almost all formats. After conversion, you can receive a file ready to watch on your iPhone, iPad, iPod, MP4, DVD, GPS, KIN One & Two, Apple TV, Zune, PSP, Walkman, Archos, Innovative Zen, iRiver PMP, Sandisk Sansa and other portable video and handheld devices, MP4/MP3 players, PS3, Wii, Xbox360, etc. Using any other converters, you are bound to be confused when handling difficult settings, or need a vast knowledge of the technical parameters of the image, which makes the conversion a very unpleasant job. This converter helps you to easily adjust audio and video parameters, making the conversion an easy operation.” The rounded corners on this app really show the options that a native development such as Delphi provide.
Fri Feb 12 2021 22:58:14 GMT+0700 (Western Indonesia Time)
VisualNEO Web, is a Windows software to create HTML5 Web Apps, Progressive Web Apps (PWA), NW.js Desktop Apps and PhoneGap Apps and it is developed with Delphi. Develop apps yourself for the Web, Desktop and Mobile devices with VisualNEO Web. According to the developer you can, “Combine quickly text, pictures, sound, video, HTML content, Internet links, special effects and other elements to create interactive, professional Web and Mobile Apps. Even if you don’t know modern web technologies such as HTML5, CSS3, JavaScript or JQuery you can create awesome applications thanks to our drag and drop visual interface and our easy to learn, wizard-assisted NeoScript programming language. Perfect for students and designers. VisualNEO is easy to use for novice developers and quick for experienced ones.” This is another great example demonstrating that Delphi is a great tool for building other development tools.
Main features:
WYSIWYG IDE (Integrated Development Environment).
RAD Tool (Rapid Application Development).
Easy to install.
Beginners Friendly.
Compile to HTML5, PWA, NW.js, PhoneGap and/or Windows Executable.
Easy to learn wizard-assisted programming language (NeoScript)
Use NeoScript, JavaScript or both.
Based in AngularJS, BootStrap and JQuery.
Database tools included for MySQL and SQLite.
PHP WebServer included.
2D and 3D Vector drawing commands.
Easy quizzes and drag-drop games.
Include multimedia files (Video, sound, images…)
Plugin generator (add any JavaScript or JQuery library)
Fri Feb 12 2021 22:53:53 GMT+0700 (Western Indonesia Time)
Make A Number game developed for a 10th Grade IT class assignment and it is developed in Delphi. According to the developer, “it is a math game. The objective is to use the given numbers and operators (*, /, +, -) to make a given number. There are 2 different difficulty levels, Beginner – where you can use any operator any amount of times, and Expert – where you can only use an operator once. Please note this game was developed when I was in grade 10 and was my first year of programming as well as using Delphi.” This is a great example of how Object Pascal is a teaching language and the UI designer in Delphi is a great tool for beginners and experts alike.
Fri Feb 12 2021 21:58:10 GMT+0700 (Western Indonesia Time)
Chronic allergy sufferers know well the daily discomfort of seasonal allergies and environmental allergies. They also likely know about allergy shots — the treatment that requires you to go into an office to get shots on a weekly or monthly basis. But there is a lesser-known treatment, allergy drops, that requires a bit less effort. Wyndly, a startup participating in Y Combinator’s current batch, aims to make allergy drops more accessible to people.
Before the pandemic, Dr. Manan Shah, an otolaryngologist (an ear, nose, throat doctor), would have his patients come in for an evaluation and then prescribe them personalized allergy drops to train their immune system to fight off allergy triggers. When the COVID-19 pandemic hit, Shah, began treating his patients suffering from allergies via telemedicine. That went well so Dr. Shah and his cousin, Aakash Shah, took their idea to Y Combinator. They showed their idea was working well in Denver, Colorado but wanted help taking it nationwide.
Through Wyndly, Dr. Shah can conduct both allergy testing and treatment via telemedicine. Unlike allergy shots, allergy drops can be taken at home. Wyndly aims to treat environmental allergies, like cats, dogs, dust mites, mold, pollen, trees, grasses and weeds.
“Most people don’t realize there is this other option,” Dr. Shah said. “I think most people think the only option for allergies are shots or taking antihistamines every day. we educate people there is this wonderful therapy and we can make it available to you in the most convenient way.”
Wyndly works by first evaluating a patient’s allergies. Patients can either submit a recent allergy test to Wyndly, or take Wyndly’s at-home finger prick test. Next, Wyndly prepares personalized allergy drops for the patient and sends a vial to the patient’s home. Then, at some point during the day, patients take five drops under the tongue. Dr. Shah said most patients see a decrease in their symptoms after taking these drops daily for six months.
Wyndly costs $99 per month for allergy drop treatment, which could come out to around $594 in total, if a patient takes them for six months. If you become a patient, the allergy test costs $0 but if you don’t become a patient, the test costs $200.
While allergy drops are easy to take, there’s a caveat. Insurance companies typically do not cover the cost of the treatment, while they generally do for allergy shots. But Wyndly says it aims to be the same cost as what someone would pay for insurance-covered allergy shots plus co-pays.
It’s also worth noting that these allergy drops are not approved by the Food and Drug Administration. While they are made using the same medications that are FDA-approved for allergy shots, the compounded medication is not itself approved and regulated by the FDA, Dr. Shah said.
Down the road, Wyndly may look to treat food allergies but Shah says there’s not enough data about its safety.
“I just want to see a little more research and for the field to reach a consensus on safety,” Shah said. “We hope to do food in the future if it ends up being proven to be really effective.”
Wyndly is has been in Y Combinator for a little over a month now and has been slowly expanding its offerings. Through partnerships with physicians, Wyndly is able to offer its services in 38 states throughout the country. By the end of 2022, Wyndly hopes to be in all 50 states.
Fri Feb 12 2021 21:09:27 GMT+0700 (Western Indonesia Time)
Even though Kevin Busque is a co-founder of TaskRabbit, he didn’t get the response he was hoping for the first time he pitched his new venture to Felicis Ventures’ Aydin Senkut. Nonetheless, he said the outcome was one of the best things that could have happened.
“I’m kind of glad that he didn’t invest at the time because it really forced me to take a hard look at what we were doing and really enabled us to become Guideline,” said Busque. “That seed round was an absolute slog. I think I spent seven or eight months trying to raise a round for a product that didn’t exist, going purely on vision.”
Eventually, that idea evolved into Guideline, which describes itself as “a full-service, full-stack 401(k) plan” for small businesses. Eventually, Senkut did write a check — Felicis led Guideline’s $15 million Series B round. Today, Guideline has more than 16,000 businesses across 60+ cities, with more than $3.2 billion in assets under management. The company has raised nearly $140 million.
This week on Extra Crunch Live, Busque and Senkut discussed Guideline’s Series B pitch deck — which Senkut described as a “role model” — and how they built trust over time.
The duo also offered candid, actionable feedback on pitch decks that were submitted by Extra Crunch Live audience members. (By the way, you can submit your pitch deck to be featured on a future episode using this link right here.)
We’ve included highlights below as well as the full video of our conversation.
Senkut and Busque met nearly a decade ago, when Busque was still at TaskRabbit. Several years later, Busque launched out on his own and went fundraising for his original idea. Even though he got a no from Senkut, it wasn’t an easy decision.
Looking back, Senkut said he had much more freedom to follow his instincts while angel investing.
“As an institutional fund with LPs, we were feeling the pressure of checking all the checkmarks,” explained Senkut. “It’s amazing how, sometimes, being more structured or analytical actually does not always lead you to make better decisions.”
When Busque came back around after the pivot, looking to raise a Series B, Senkut called it a “no-brainer,” particularly because of the type of CEO Busque is.
“My opinion of Kevin as a person is that he’s an excellent wartime CEO, but also he’s a product visionary,” said Senkut. “We call them ‘missionary CEOs.’ There are mercenary CEOs who can extract every ounce of dollar from a rock, but we are gravitating much more toward CEOs like Kevin who are focused on product first. People who have a really acute vision of what the problem is, and. a very specific vision for how to solve that problem and ultimately turn it into a long-term scalable and successful company.”
Busque said he was drawn to Senkut based on his level of conviction, explaining that Senkut doesn’t always have to go by the book.
“If he wants to write a check because the founder is great or the product is great, he does it,” said Busque. “It’s not necessarily that he has to see a certain metric or growth pattern.”
Building trust
Obviously, years of staying connected and communicating (and not just about Guideline) laid the foundation for building a relationship. Busque said the honesty in their conversations, including Senkut’s initial rejection, lended itself greatly to the trust they have.
Fri Feb 12 2021 20:42:37 GMT+0700 (Western Indonesia Time)
Throughout the coronavirus pandemic, the importance of “following the data” has been emphasized repeatedly, and for good reason: It provides the best chances for us to minimize the harm caused by COVID-19. However, when it comes to government officials actually adhering to the data-driven mantra, it’s a mixed bag, at best.
The entire world has relied on predictive models to forecast the spread of COVID-19 in an attempt to get in front of the virus and avoid the worst impacts. Since the virus emerged in the United States last winter, those predictive models have been quite good, says Babak Hodjat, the vice president of evolutionary AI at Cognizant, which has been involved in modeling the virus.
“It’s been surprisingly accurate in many of these regions to forecast,” says Hodjat, who has been tracking the virus and is currently a judge in the XPRIZE Pandemic Response Challenge, which seeks better predictive and prescriptive models for combatting COVID-19. “I can tell you, having stood up this system since May of last year, you could tell back in May that schools are not going to open in California, or that workplaces are going to remain shut.”
With COVID-19 vaccines now available, public health officials have the best weapon yet to stem the spread of the coronavirus, which has infected nearly 108 million people around the globe and killed almost 2.4 million, according to the Johns Hopkins University Coronavirus Resource Center. In the U.S., the data shows we’re on the downslope of the third surge, an event that was predicted by models developed by Cognizant and others.
Three surges are clearly evident in the 7-day trailing daily tally of COVID-19 cases in the United States (image source: Google)
As new variants emerge and spread rapidly, it’s now a race against time to vaccinate as many people as possible before the virus regains strength and mounts a fourth surge against its human hosts. But a fourth surge is a likelihood in practically every model at the Fred Hutchinson Cancer Research Center, according to a new paper published last week. The variants make a fourth surge, probably starting in late March, a likelihood.
The only scenario in which it doesn’t make a fourth surge likely, per the cancer center’s study, is if the vaccines remain resistant to the variants, if the vaccination rate is dialed up past the current goal of 1.5 million shots per day, and if people become even more strict about mask-wearing and social distancing.
These are scenarios that the teams participating in the XPRIZE have been modeling, with the goal of coming up with the model that best informs public health officials about how to proceed in combatting the virus. Cognizant’s Hodjat is hopeful the XPRIZE will yield the best of data-driven science.
“As new strains come in, as new interventions come in, you’re retraining your whole model, your prediction and prescription, almost on a daily basis,” he says. “That’s the best we can do. There’s no crystal ball. We won’t know for sure. But the best we can do is keep up with the data as it changes.”
His best estimate at this point is that we probably won’t nip it in the bud this spring. “I think we’ll be with this pandemic for a while,” Hodjat says. “I’m hoping upon hope that we can get in front of it with the vaccine. But I don’t know if that’s going to happen.”
Public Health Response
With dual mandates–to stem the spread of COVID-19 while minimizing damage to the economy–public health officials are in a tough spot. In some ways, it’s a no-win situation, as there’s no way to prevent damage to either side. But by adhering to the data and gaining as much precision as possible in prescribing methods with the best chances of stemming the spread, we can achieve the optimal balance between our medical and economic well-beings.
(PopTika/Shutterstock)
“We’re not solving for a single objective,” Hodjat says. “There are two objectives. The economy matters. Containing it matters. There’s a balance you need to achieve between containment and the economy. I think it’s very important for regional authorities to take that into account, that there is no one answer.”
As infectious disease experts and data scientists try to keep up with the changing conditions on the ground, public health officials are fighting to maintain the data-driven high ground. One of the states that has struggled greatly in stemming the spread of the disease while mitigating economic impacts is California.
Governor Gavin Newsom won praise in March 2020 for instituting one of the nation’s earliest lockdowns. Over the ensuring months, California maintained one of the strictest lockdown profiles in the country. The state’s Department of Public Health devised a color-coded system that corresponded with which activities would be allowed in each of its 58 counties. As the situation improved in the summer, lockdowns were eased in certain counties, only for the number of infections to rise again in the fall.
However, as the number of infections in the Golden State rose in early December, the Department of Public Health abandoned its previous color-coded system and replaced it with a new regional lockdown scheme that was dependent upon a single metric. Instead of basing the decision to shut down businesses and schools on factors like the case rate per 100,000 people, the number of community outbreaks, or a trailing 14-day average for positive COVID-19 tests, as it was before, the lockdowns in California hinged upon a single metric: ICU capacity.
What’s more, instead of using the actual ICU capacity figures that hospitals share on a near daily basis, California DPH created a derived figure that attempted to build a buffer into ICU capacity for non-COVID cases. The state did this by marking ICU availability down by 0.5% for every 1% of ICU capacity used by COVID-19 patients above the 30% threshold. This change resulted in the Southern California region, which is home to over 20 million people, having an ICU availability rate pegged at 0% for over a month despite the fact that thousands of ICU beds were actually available across the region.
Crouching COVID, Hidden Data
Confusion around California’s approach grew until late January, when members of Newsom’s administration said there was another factor at play in the lockdown order: forecasted ICU availability. The situation reached a head for Newsom’s administration when public health officials refused to share the model that it used for the forecast.
California Gov. Gavin Newsom’s administration has come under fire for repeatedly changing criteria for lifting the COVID-19 economic lockdown (mccv/Shutterstock)
“At the moment the projections are not being shared publicly,” Department of Public Health spokeswoman Ali Bay told AP reporters via email in January. “These fluid, on-the-ground conditions cannot be boiled down to a single data point–and to do so would mislead and create greater uncertainty for Californians,” California Health and Human Services spokeswoman Kate Folmar told AP reporters.
Soon thereafter, Newsom announced that California was abandoning the five-region approach based on the adjusted ICU metric and going back to the original color-coded, county-by-county scheme. The stated reason for this change was that the projected ICU availability metric indicated that new infection rates would begin to abate. But without access to the data or the models, nobody but Newsom’s administration knew for sure.
This lack of transparency into data, as well as the continual shifting of metrics that are the basis for lockdowns in the nation’s most populous state, have eaten into Newsom’s popularity. This has helped to spur an attempt to recall Newsom, whose popularity rate has fallen nearly 20% over the course of the pandemic. (The fact that the governor was photographed attending a mask-less dinner party with a dozen others, while asking citizens of the state to avoid such gatherings, added fuel to the recall fire).
Political Data Lessons
The story of Newsom’s handling of the coronavirus epidemic in California is not yet over, as a projected fourth wave threatens to bring numbers back up. The continued lockdown of schools and the failure of distance learning for over a million California students who have not yet returned to in-school instruction adds a political intangible to Newsom’s COVID decision-making.
Australia’s strict lockdown is credited with keeping COVID-19 deaths under 1,000 for a country with 24.3 million
California’s story stands in contrast to how the pandemic has been handled in Australia, which has seen fewer than 1,000 deaths and has gone long stretches without COVID-19 cases (although a case of COVID-19 in Melbourne, the home of the Australian Open tennis tournament, has instituted a 2-million person lockdown in recent days).
Glen Rabie, the CEO of Australian analytics firm Yellowfin, gives credit to public health officials in Australian states for enacting a very tough lockdown in the beginning of the pandemic and largely sticking with it.
“The Australian approach was far tougher very early on,” Rabie tells Datanami. “Mistakes in the process were made [in Victoria] which led to the very long lockdown. However, there was a political will to enforce these policies with a view that it is better for the entire population versus the rights of individuals.”
There were significant costs to this approach, but politicians in Australian states (which, like their American counterparts, were in charge of the response to the virus) were willing to pay that price, Rabie says. The one criticism that has stuck was that officials, primarily in the state of Victoria, home to the city of Melbourne, have repeatedly moved the goalposts, which has weakened the trust that the governed put into their leaders.
“A criticism of the general political approach to lock down would be the lack of guidance driven by the data,” Rabie says. “It seemed that decisions were largely made on the fly and that communicated thresholds–i.e. if we hit this level of daily rates we will open retail–were often changed. This gave the perception that data and facts were not in actual fact being used by the Victorian government in particular to make decisions. Rather a very large hammer was being used to crack in some cases a very small nut.”
An American Lesson
In recent days, reports have emerged that New York Governor Andrew Cuomo office withheld data about the number of COVID-19 deaths in nursing homes out of fear that it would cause political damage. More than 15,000 people died of COVID-19 in New York nursing homes following a controversial decision by the governor to move seniors infected with the virus out of hospitals and into nursing homes around the state.
According to a transcript of a call with state representatives, the governor’s secretary, Melissa DeRosa, stated that the governor’s office withheld the number of deaths because “we weren’t sure if what we were going to give to the Department of Justice…was going to be used against us.”
The COVID-19 pandemic has tested people and governments like they have never been tested before. In many cases, public health officials have maintained their allegiance to transparent data and open science, and it has resulted in successfully fighting the spread of the disease. But as we have seen in New York and California, there have been significant exceptions. The lack of transparency around data and the damage that does to the public trust may be one of the most enduring lessons of the COVID-19 pandemic.
According to Rabie, there were attempts to politicize the pandemic at the federal level in Australia early on, but it faded away. That has not happened in the U.S., where the politicization of COVID-19 modeling and data was amplified.
“The key failing in the U.S. was political,” Rabie says. “By politicizing the pandemic, data and facts were largely ignored and a consistent and coordinated health services response became all but impossible. Clearly there were (and are) parties in the U.S. that understand the data and the implication of the pandemic. However I suspect that no one anticipated the true cost of the pandemic to the general population and the economy as a whole.”
Fri Feb 12 2021 20:12:59 GMT+0700 (Western Indonesia Time)
Remote-first startups were still controversial in Silicon Valley when we launched Extra Crunch two years ago today. Back then, if you can recall, the rest of the world was not even sure how all those unicorns were going to do on the public markets.
Today, Silicon Valley resides on the cloud and is publicly traded. We’ve covered the stunning changes, and as we help founders navigate the path from idea to first check to IPO, we also tripled the number of Extra Crunch members.
Now, as the world glimpses a brighter, post-pandemic future, we are doubling down on the news and analysis that’s helped many early-stage companies make better decisions.
As Extra Crunch enters its third year, we’re putting our foot on the gas so we can bring you more:
Fresh analysis about today’s most dynamic tech industries.
We’ll also publish more articles with inside tips from industry experts to help you solve nonsoftware problems that face every company, like fundraising, growth and hiring, as well as deep dives into different industry sectors and pre-public companies.
We’re tying all of these efforts back in with the editorial coverage and event plans at TechCrunch. And to make this holistic approach truly successful, we’re ramping up efforts to engage and expand the Extra Crunch community.
In recent weeks, reporters and editors have appeared on Clubhouse and Discord to discuss their work with readers. We’re planning to expand this outreach, so stay tuned!
To show our appreciation for your support, we’re offering a 20% discount on two-year subscriptions through Monday, February 15 to celebrate our second anniversary. If you’re already a member, you can renew at a discount.
If you’re not a Extra Crunch member yet, we hope you’ll join us.
Fri Feb 12 2021 20:09:44 GMT+0700 (Western Indonesia Time)
A new BuzzFeed quiz is the first in what Director of Product for Quizzes Chris Johanesen said he’s hoping will be a series of “stunt-y experiments” that the publisher launches this year.
The quiz, timed for Valentine’s Day weekend, promises to “create your perfect boyfriend (or girlfriend) using AI technology.” Johanesen said it’s designed to “poke fun at the situation we’re all in” (quarantine, obviously), as well as the “weird world of online dating.”
To take the quiz, you answer a series of multiple-choices questions about what you’re looking for in your ideal romantic partner.
The questions will probably feel familiar to anyone who’s taken a quiz on BuzzFeed or elsewhere online, but the answer should be a lot more unique: Johanesen noted that in a normal online quiz, there might be “12 or 20 different results that are written, and that’s pretty much it.” With this one, “you could retake it dozens of times and never get the same results.”
Johanesen explained that the BuzzFeed team generated an enormous variety of different profile images using StyleGAN technology. For the text, BuzzFeed staff contributed personality traits, text messages quotes, hobbies and “weird, dark stuff” that the quiz combines algorithmically.
“I think we’re mostly trying to embrace the absurdity of it,” he added. (I saw this myself when I tried out a demo earlier this week and was assigned a girlfriend who wanted to show off her “collection of scabs.”) “We try to match it a little bit to some of your inputs so that it’s not totally random. … An early version was more realistic, but it wasn’t as fun.”
Looking ahead, Johanesen said he’s hoping to create more quizzes that are “more generative,” where a writer might come up with a concept but they don’t have to “handwrite every single option.” Still, it sounds like this approach requires significant editorial work, which Johanesen doesn’t expect to change.
“We could definitely use machine learning models to write a quiz, but it probably wouldn’t be very good,” he said. Instead, the team is interested in “that intersection of what technology can do that humans can’t, and what humans can do that technology can’t.”
More broadly, he noted that BuzzFeed is experimenting to find new ways to refresh the quiz format, for example with the Quiz Party feature and Quiz Streaks.
Coupang’s revenue growth is nothing short of fantastic.
Coupang’s offering, coming amidst the public debut of a number of well-known technology brands, will be a massive affair. Its first S-1 filing indicates that its IPO will raise capital in the range of $1 billion, far larger than the $100 million placeholder that is more common.
But the company’s scale makes its lofty IPO fundraising goals reasonable. Coupang is huge, with revenues north of $10 billion in 2020 and in improving financial health as it scales. And its revenue growth has accelerated.
This afternoon, let’s dig into the company’s historical growth, its improving cash flow and its narrowing losses. Coupang’s debut will create a splash when it lands, so we owe it to ourselves to grok its numbers.
And as there are other e-commerce brands with a delivery function waiting in the wings to go public — Instacart comes to mind — how Coupang fares in its IPO matters for a good number of domestic startups and unicorns.
Coupang’s surging scale
The company’s growth across the last half-decade is impressive. Observe its yearly revenue totals from 2016 through 2020:
2016: $1.67 billion.
2017: $2.4 billion (+43.7%).
2018: $4.05 billion (+68.8%).
2019: $6.27 billion (+54.8%).
2020: $11.97 billion (+90.9%).
Sure, some of that 2020 growth is COVID-19 related, but even taking that into account, Coupang’s revenue growth is nothing short of fantastic. And what’s better is that the company has cut its losses in recent years:
Fri Feb 12 2021 19:31:20 GMT+0700 (Western Indonesia Time)
Minneapolis voted Friday to ban the use of facial recognition software for its police department, growing the list of major cities that have implemented local restrictions on the controversial technology. After an ordinance on the ban was approved earlier this week, 13 members of the city council voted in favor of the ban, with no opposition.
The new ban will block the Minneapolis Police Department from using any facial recognition technology, including software by Clearview AI. That company sells access to a large database of facial images, many scraped from major social networks, to federal law enforcement agencies, private companies and a number of U.S. police departments. The Minneapolis Police Department is known to have a relationship with Clearview AI, as is the Hennepin County Sheriff’s Office, which will not be restricted by the new ban.
The vote is a landmark decision in the city that set off racial justice protests around the country after a Minneapolis police officer killed George Floyd last year. The city has been in the throes of police reform ever since, leading the nation by pledging to defund the city’s police department in June before backing away from that commitment into more incremental reforms later that year.
Banning the use of facial recognition is one targeted measure that can rein in emerging concerns about aggressive policing. Many privacy advocates are concerned that the AI-powered face recognition systems would not only disproportionately target communities of color, but that the tech has been demonstrated to have technical shortcomings in discerning non-white faces.
Cities around the country are increasingly looking to ban the controversial technology and have implemented restrictions in many different ways. In Portland, Oregon, new laws passed last year block city bureaus from using facial recognition but also forbid private companies from deploying the technology in public spaces. Previous legislation in San Francisco, Oakland and Boston restricted city governments from using facial recognition systems, though didn’t include a similar provision for private companies.
Fri Feb 12 2021 17:37:53 GMT+0700 (Western Indonesia Time)
The All-22 tape is perhaps one of the most valued tools for professional football coaches because it allows the viewer to see all 22 players on the field at the same time. It improves a coach’s line of sight and, most importantly, helps avoid missing a critical motion or player.
The upshot: It removes the blind spot. The concept of this tool can — and should — be applied in the startup world as well. Successful founders and investors understand the playbook on both sides of the ball. For founders, that means being able to zoom out and see each of their employees’ points of view and being inclusive. Without an All-22 tape, founders can mistakenly spend too much on engineering while ignoring the product rollout strategy, or forget to communicate with employees outside of their bubble of interest. A company can become fragmented as more blind spots emerge, which can ultimately lead to oversights that damage its reputation, operations or even its ability to raise money from investors.
It’s a skillset that is developed through practice. Luckily, Eghosa Omoigui, the founder and managing general partner of EchoVC Partners, a seed and early-stage technology venture capital firm serving underrepresented founders and underserved markets, is coming to Early Stage 2021 to give early-stage founders the tools they need to develop their own All-22 tape.
TC Early Stage – Operations & Fundraising is a virtual event focused on early-stage founders happening on April 1 & 2. The event will include breakout sessions led by investors and experts that break down the most difficult parts of building a business.
Here’s a look of Omoigui’s talk:
The All-22 View
Improving line of sight and dynamic field of play aperture is rarely discussed but hugely important. Great founders, operators and investors have an understanding of playbooks on both sides of the ball. We’ll talk through learnings and some ideas on how to build muscle memory and skillsets.
Omoigui, who was previously director of consumer internet and semantic technologies at Intel Capital, will share his experiences and tips to help founders see every aspect of their company. Register for TC Early Stage 2021 today and catch his All-22 Tape talk.
Fri Feb 12 2021 16:50:20 GMT+0700 (Western Indonesia Time)
Bertrand PiccardContributor
Bertrand Piccard initiated the Solar Impulse Foundation after his history-making flight around the world in a solar-powered plane. Fueled only by the rays of the sun, his flight proved that existing methods and technologies can provide clean energy and solutions that protect the environment in a profitable way.
Five years ago I landed the Solar Impulse 2 in Abu Dhabi after flying around the globe powered solely by solar energy, a first in aviation history.
It was also a milestone in energy and technology history. Solar Impulse was an experimental plane, weighing as little as a family car and using 17,248 solar cells. It was a flying laboratory, full of groundbreaking technologies that made it possible to produce renewable energy, store it and use it when necessary in the most efficient manner.
The time has come to use technology again to address the climate crisis affecting us all. As we enter the most crucial decade of climate action — and most likely our last chance to limit global warming to 1.5°C — we need to ensure that clean technologies become the only acceptable norm. These technologies exist now and they can be profitably implemented at this crucial moment.
Hundreds of clean tech solutions exist that protect the environment in a profitable way,
Here are just four innovations from our solar-powered plane that the market can start using now before it’s too late.
From insulating the cabin to insulating our homes
The building sector is one of the largest energy consumers in the world. Next to a reliance on carbon-heavy fuels for heating and cooling, poor insulation and associated energy loss are among the main reasons.
Inside Solar Impulse’s cockpit, insulation was crucial for the plane to fly at very high altitudes. Covestro, one of our official partners, developed an ultra-lightweight and insulating material. The cockpit insulation performance was 10% higher than the standards at the time because the pores in the insulating foam were 40% smaller, reaching a micrometer scale. Thanks to its very low density of fewer than 40 kilograms per cubic meter, the cockpit was ultra-lightweight.
This technology and many others exist. We now need to ensure that all market players are motivated to make hyperefficient building insulation their standard operating procedure.
From propelling an electric aircraft to propelling clean mobility
Solar Impulse was first and foremost an electric airplane when it flew 43,000 km without a single drop of fuel. Its four electric motors had a record-beating efficiency of 97%, far ahead of the miserable 27% of standard thermal engines. This means that they only lost 3% of the energy they used versus 73% for combustion propulsion. Today, electric vehicle sales are soaring. According to the International Energy Agency, when Solar Impulse landed in 2016, there were approximately 1.2 million electric cars on the road; the figure has now risen to over 5 million.
Nevertheless, this acceleration is far from enough. Power sockets are still far from replacing petrol pumps. The transport sector still accounts for one-quarter of global energy-related CO2 emissions. Electrification must happen much more quickly to reduce CO2 emissions from our tailpipes. To do so, governments need to boost the adoption of electric vehicles through clear tax incentives, diesel and petrol engine bans, and major infrastructure investments. 2021 should be the year that puts us on a one-way road to zero-emission vehicles and puts thermal engines in a dead end.
An aircraft microgrid can work for off-grid communities
To fly for several days and nights, reaching a theoretically endless flight potential, Solar Impulse relied on batteries that stored the energy collected during the day and used it to power its engines during the night.
What was made possible with Si2 on a small scale should guide the way to future-proofing power-generation systems that are made up entirely of renewable energy. In the meantime, microgrids, like those used in Si2, could benefit off-grid systems in remote communities or energy islands, allowing them to abolish diesel or other carbon-heavy fuels already today.
On a larger scale, we are looking at smart grids. If all “stupid grids” were replaced by smart grids, it would allow cities, for example, to manage production, storage, distribution and consumption of energy and to cut peaks in energy demand that would reduce CO2 emissions dramatically.
Energy efficiency in the air and on the ground
Solar Impulse’s philosophy was to save energy instead of trying to produce more of it. This is why the relatively small amount of solar energy we collected became enough to fly day and night. All the airplane parameters, including wingspan, aerodynamics, speed, flight profile and energy systems, had therefore been designed to minimize energy loss.
Unfortunately, this approach still stands out against the inefficiency of most of our energy use today. Even though the IEA found energy efficiency improved by an estimated 13% between 2000 and 2017, it is not enough. We need bolder action by policymakers to encourage investors. One of the best ways to do so is to put strict energy efficiency standards in place.
For example, California has set efficiency standards on buildings and appliances, such as consumer electronics and household appliances, estimated to have saved consumers more than $100 billion in utility bills. These measures are as good for the environment as they are for the economy.
Si2 was the future; now, it should define the present
When we used all these different innovations to build Solar Impulse, they were groundbreaking and futuristic. Today, they should define the present; they should be the norm. Next to the technologies mentioned above, hundreds of clean tech solutions exist that protect the environment in a profitable way, many of which have received the Solar Impulse Efficient Solution Label.
Just as for the Si2 technologies, we must now ensure that they enter the mainstream market. The faster we scale them, the faster we will set our economy on track to achieve the Paris Agreement goals and attain sustainable economic growth.
Fri Feb 12 2021 16:16:24 GMT+0700 (Western Indonesia Time)
Uber and Lyft lost a lot of money in 2020. That’s not a surprise, as COVID-19 caused many ride-hailing markets to freeze, limiting demand for folks moving around. To combat the declines in their traditional businesses, Uber continued its push into consumer delivery, while Lyft announced a push into business-to-business logistics.
But the decline in demand harmed both companies. We can see that in their full-year numbers. Uber’s revenue fell from $13 billion in 2019 to $11.1 billion in 2020. Lyft’s fell from $3.6 billion in 2019 to a far-smaller $2.4 billion in 2020.
But Uber and Lyft are excited that they will reach adjusted profitability, measured as earnings before interest, taxes, depreciation, amortization and even more stuff stripped out, by the fourth quarter of this year.
Ride-hailing profits have long felt similar to self-driving revenues: just a bit over the horizon. But after the year from hell, Uber and Lyft are pretty damn certain that their highly adjusted profit dreams are going to come through.
This morning, let’s unpack their latest numbers to see if what the two companies are dangling in front of investors is worth desiring. Along the way we’ll talk BS metrics and how firing a lot of people can cut your cost base.
Uber
Using normal accounting rules, Uber lost $6.77 billion in 2020, an improvement from its 2019 loss of $8.51 billion. However, if you lean on Uber’s definition of adjusted EBITDA, its 2019 and 2020 losses fall to $2.73 billion and $2.53 billion, respectively.
So what is this magic wand Uber is waving to make billions of dollars worth of red ink go away? Let’s hear from the company itself:
We define Adjusted EBITDA as net income (loss), excluding (i) income (loss) from discontinued operations, net of income taxes, (ii) net income (loss) attributable to non-controlling interests, net of tax, (iii) provision for (benefit from) income taxes, (iv) income (loss) from equity method investments, (v) interest expense, (vi) other income (expense), net, (vii) depreciation and amortization, (viii) stock-based compensation expense, (ix) certain legal, tax, and regulatory reserve changes and settlements, (x) goodwill and asset impairments/loss on sale of assets, (xi) acquisition and financing related expenses, (xii) restructuring and related charges and (xiii) other items not indicative of our ongoing operating performance, including COVID-19 response initiative related payments for financial assistance to Drivers personally impacted by COVID-19, the cost of personal protective equipment distributed to Drivers, Driver reimbursement for their cost of purchasing personal protective equipment, the costs related to free rides and food deliveries to healthcare workers, seniors, and others in need as well as charitable donations.
Er, hot damn. I can’t recall ever seeing an adjusted EBITDA definition with 12 different categories of exclusion. But, it’s what Uber is focused on as reaching positive adjusted EBITDA is key to its current pitch to investors.
We remain on track to turn the EBITDA profitable in 2021, and we are confident that Uber can deliver sustained strong top-line growth as we move past the pandemic.
So, if investors get what Uber promises, they will get an unprofitable company at the end of 2021, albeit one that, if you strip out a dozen categories of expense, is no longer running in the red. This, from a company worth north of $112 billion, feels like a very small promise.
And yet Uber shares have quadrupled from their pandemic lows, during which they fell under the $15 mark. Today Uber is worth more than $60 per share, despite shrinking last year and projecting years of losses (real), and possibly some (fake) profits later in the year.
Fri Feb 12 2021 15:43:36 GMT+0700 (Western Indonesia Time)
Cloud monitoring platform Datadog has announced that it plans to acquire Sqreen, a software-as-a-service security platform. Originally founded in France, Sqreen participated in TechCrunch’s Startup Battlefield in 2016.
Sqreen is a cloud-based security product to protect your application directly. Once you install the sandboxed Sqreen agent, it analyzes your application in real time to find vulnerabilities in your code or your configuration. There’s a small CPU overhead with Sqreen enabled, but there are some upsides.
It can surface threats and you can set up your own threat detection rules. You can see the status of your application from the Sqreen dashboard, receive notifications when there’s an incident and get information about incidents.
For instance, you can see blocked SQL injections, see where the injection attempts came from and act to prevent further attempts. Sqreen also detects common attacks, such as credential stuffing attacks, cross-site scripting, etc. As your product evolves, you can enable different modules from the plugin marketplace.
Combining Datadog and Sqreen makes a lot of sense, as many companies already rely on Datadog to monitor their apps. Sqreen has a good product, Datadog has a good customer base. So you can expect some improvements on the security front for Datadog.
Sqreen raised a $2.3 million round from Alven Capital, Point Nine Capital, Kima Ventures, 50 Partners and business angels. It then participated in TechCrunch’s Startup Battlefield — it made it to the finals but didn’t win the competition. The startup attended Y Combinator a bit later.
In 2019, Sqreen raised a $14 million Series A round led by Greylock Partners with existing investors Y Combinator, Alven and Point Nine participating once again.
Datadog and Sqreen have signed a definitive acquisition agreement. Terms of the deal remain undisclosed and the acquisition should close in Q2 2021.
Fri Feb 12 2021 15:36:00 GMT+0700 (Western Indonesia Time)
Most of the time, developers tend to use DataSet to manipulate the data in their applications. DataSet is helpful because it stores data in the dataset’s fields array property. You can easily access these values by number or by name. Moreover, each field can be used to read or modify the current record’s data by using its Value property or type-specific properties such as AsString, AsInteger, and so on. FireDAC itself has a built in SaveToFile and LoadFromFile (plus SaveToStream and LoadFromStream) for dataSets which supports XML, JSON, and binary.
And now, I would like to introduce you to the DataSetConverter4Delphi API. This is an API to convert JSON objects for DataSet and also doing the reverse process, like converting DataSet into JSON. And it works with the TDataSet, and TJSONObject, TJSONArray classes.
Furthermore, it is easy to add to your project, you just need to specify the path of the modules and you are good to go.
Convert DataSet to JSON
uses
DataSetConverter4D,
DataSetConverter4D.Impl;
var
ja: TJSONArray;
jo: TJSONObject;
begin
fCdsCustomers.DataSetField := nil;
fCdsCustomers.CreateDataSet;
fCdsCustomers.Append;
fCdsCustomers.FieldByName('Id').AsInteger := 1;
fCdsCustomers.FieldByName('Name').AsString := 'Customers 1';
fCdsCustomers.FieldByName('Birth').AsDateTime := StrToDateTime('22/01/2014 14:05:03');
fCdsCustomers.Post;
fCdsCustomers.Append;
fCdsCustomers.FieldByName('Id').AsInteger := 2;
fCdsCustomers.FieldByName('Name').AsString := 'Customers 2';
fCdsCustomers.FieldByName('Birth').AsDateTime := StrToDateTime('22/01/2014 14:05:03');
fCdsCustomers.Post;
//Convert all records
ja := TConverter.New.DataSet(fCdsCustomers).AsJSONArray;
//Convert current record
jo := TConverter.New.DataSet.Source(fCdsCustomers).AsJSONObject;
ja.Free;
jo.Free;
end;
Fri Feb 12 2021 15:20:54 GMT+0700 (Western Indonesia Time)
Notion, the online workspace startup that was last year valued at over $2 billion, was knocked offline after a DNS outage.
The collaborative online office and document service was not loading as of around 9 a.m. ET on Friday, preventing anyone who relies on the service from accessing their cloud-stored data.
In a since-deleted tweet, Notion asked if “any users have a contact at Name.com,” the web host that Notion relies on for its domain name. In a reply, Name.com said it was “working with the owners of this domain to address this issue as quickly as possible.” Notion replied: “Could you let us know where you’re messaging us to address this?”
The now-partially deleted tweet thread noting the apparent Notion outage. (Image: TechCrunch)
In a statement shortly after its first tweet went out, Notion told TechCrunch: “We’re experiencing a DNS issue, causing the site to not resolve for many users. We are actively looking into this issue, and will update you with more information as we receive it via our status page on Twitter.”
Notion didn’t say specifically what the DNS issue is. Domain name servers, or DNS, is an important part of how the internet works. Every time you go to visit a website, your browser uses a DNS server to convert web addresses to machine-readable IP addresses to locate where a web page is located on the internet. But if a website or its DNS server is not configured correctly, it can cause the website not to load.
It appears a misconfiguration on @NotionHQ’s domain is causing a site-wide outage
It’s not clear exactly who is responsible for this particular DNS issue. When reached, a spokesperson for Name.com did not immediately comment, and Sonic.so, the Somali-based registrar that oversees the .so country-code top level domain on which Notion relies, did not return a request for comment.
Fri Feb 12 2021 15:15:31 GMT+0700 (Western Indonesia Time)
The 2021 Cloud Report is the only cloud performance report to compare AWS, Azure, and GCP on benchmarks that reflect critical applications and workloads.
Read the report from Cockroach Labs to learn:
Which cloud is the most cost efficient
How to evaluate performance tradeoffs
How to assess the cost/benefit of disks and CPU processors
About the Report: The annual Cockroach Labs Cloud Report benchmarks AWS, Azure, and Google against each other, compiling results from over 1,000 microbenchmark tests. The big three are benchmarked on: CPU performance, network throughput and latency, storage read/write performance, and the TPC-C database benchmark.
Fri Feb 12 2021 13:58:57 GMT+0700 (Western Indonesia Time)
The new generation of consoles is fueling growth across all gaming categories in the United States. Hardware saw a 144% year-over-year surge, but software also grew 36%, according to industry-tracking firm The NPD Group. “January 2021 consumer spending across video game hardware, content,and accessories reached a January record $4.7 billion,…Read More
Fri Feb 12 2021 13:19:04 GMT+0700 (Western Indonesia Time)
TMS Software offers commercial components and libraries for RAD Studio developers from UI components to cloud computing libraries. One of the best UI component suites is the FNC Blox which is a set of cross-platform controls for Delphi & C++ Builder to easily add user-friendly flowcharting, diagramming, and graphing capabilities to your applications.
TMS FNC Blox has its panel-like component where users can build diagrams by inserting different sized lines and blocks even it is easy to link them. And the best part is you can drag and drop components in real-time as a user.
Best features of the TMS FNC Blox :
High-quality drawing blocks
Open architecture to create custom shapes
Full customization over components
Saving or loading file and stream
Zoom in/out & Panning
// Panning mode
procedure TForm1.StartPanningButtonClick(Sender: TObject);
begin
TMSFNCBloxControl1.Presenter.StartPanning;
end;
procedure TForm1.CancelPanningButtonClick(Sender: TObject);
begin
TMSFNCBloxControl1.Presenter.CancelPanning;
end;
// Loading and saving a diagram
TMSFNCBloxControl1.SaveToFile('MyBlox1.blox');
TMSFNCBloxControl1.LoadFromFile('MyBlox2.blox');
TMSFNCBloxControl1.SaveToStream(AStream);
TMSFNCBloxControl1.LoadFromStream(AStream);
Fri Feb 12 2021 12:34:02 GMT+0700 (Western Indonesia Time)
Sometimes Developers may need to monitor the network connections by process running in a machine programmatically. How to list down the network connections between local and remote address, ports , protocol, status etc. ? Don’t know how to do. Don’t worry. MiTec’s System Information Management Suite’s component helps to identify easily and we will learn how to use the thread TNetConMonThread to demonstrate the established connections by a process in this post.
Platforms: Windows.
Installation Steps:
You can easily install this Component Suite from GetIt Package Manager. The steps are as follows.
Navigate In RAD Studio IDE->Tools->GetIt Package Manager->select Components in Categories->Components->Trail -MiTec system Information Component Suite 14.3 and click Install Button.
Read the license and Click Agree All. An Information dialog saying ‘Requires a restart of RAD studio at the end of the process. Do you want to proceed? click yes and continue.
It will download the plugin and installs it. Once installed Click Restart now.
How to run the Demo app:
Navigate to the System Information Management Suite trails setup, Demos folder which is installed during Get It installation e.g) C:UsersDocumentsEmbarcaderoStudio21.0CatalogRepositoryMiTeC-14.3DemosDelphi20
Open the NetCon project in RAD studio 10.4.1 compile and Run the application.
This Demo App shows how to list down network connections by process in your machine and show the connection record properties.
Components used in MSIC NetCon Demo App:
TNetConMonThread: Monitors network connections by processes in real-time and provides their properties. This class is singleton – it means it ensures to be instantiated only once per application.
TListView for viewing network connections between peers.
Implementation Details:
An instance FNCMof TNetConMonThread is created. And in regular interval of thread the Network connections list is refreshed and updated to the screen using the OnInterval Event handler.
On each interval, the Network connections List( using TNetConRecord) is added to the list view by clearing the existing list and looping the RecordCount.
procedure TwndMain.RefreshList;
var
i,c: Integer;
vp: Integer;
SInfo: TScrollInfo;
r: TRect;
p: TNetConRecord;
s: string;
vi: TVersionInfo;
begin
SInfo.cbSize:=SizeOf(SInfo);
SInfo.fMask:=SIF_ALL;
GetScrollInfo(List.Handle,SB_VERT,SInfo);
vp:=SInfo.nPos;
List.Items.BeginUpdate;
try
List.Items.Clear;
c:=FNCM.RecordCount;
for i:=0 to c-1 do begin
FNCM.GetRecord(i,p);
p.ProcessName:=GetProcessName(p.PID);
FNCM.SetProcess(i,p.ProcessName,vi,-1);
with List.Items.Add do begin
Caption:=Format('%s (%d)',[p.ProcessName,p.PID]);
if not IsAddressNull(p.LocalAddress) then
SubItems.Add(p.LocalAddressString)
else
SubItems.Add(MachineName);
if p.LocalPort>0 then
SubItems.Add(IntToStr(p.LocalPort))
else
SubItems.Add('');
if not IsAddressNull(p.RemoteAddress) then
SubItems.Add(p.RemoteAddressString)
else if SameText('UDP',p.Protocol) then
SubItems.Add('')
else
SubItems.Add(MachineName);
if p.RemotePort>0 then
SubItems.Add(IntToStr(p.RemotePort))
else
SubItems.Add('');
s:=p.Protocol;
if p.Typ=AF_INET6 then
s:=s+'6';
SubItems.Add(s);
if SameText('TCP',p.Protocol) then
case p.State of
MIB_TCP_STATE_CLOSED: SubItems.Add('Closed');
MIB_TCP_STATE_LISTEN: SubItems.Add('Listen');
MIB_TCP_STATE_SYN_SENT: SubItems.Add('SYN sent');
MIB_TCP_STATE_SYN_RCVD: SubItems.Add('SYN received');
MIB_TCP_STATE_ESTAB: SubItems.Add('Established');
MIB_TCP_STATE_FIN_WAIT1: SubItems.Add('FIN wait 1');
MIB_TCP_STATE_FIN_WAIT2: SubItems.Add('FIN wait 2');
MIB_TCP_STATE_CLOSE_WAIT: SubItems.Add('Close wait');
MIB_TCP_STATE_CLOSING: SubItems.Add('Closing');
MIB_TCP_STATE_LAST_ACK: SubItems.Add('Last ACK');
MIB_TCP_STATE_TIME_WAIT: SubItems.Add('Time wait');
MIB_TCP_STATE_DELETE_TCB: SubItems.Add('Delete TCB');
else SubItems.Add('Unknown');
end
else
SubItems.Add('');
end;
end;
finally
List.Items.EndUpdate;
end;
if List.Items.Count>0 then begin
List.Items.BeginUpdate;
try
r:=List.Items[0].DisplayRect(drBounds);
List.Scroll(0,vp*(r.Bottom-r.Top));
finally
List.Items.EndUpdate;
end;
end;
sb.Panels[0].Text:=Format('%d item(s)',[List.Items.Count]);
end;
MiTeC Network Connections Demo
It’s that simple to monitor network connections established in your machine and view the details of the connections. Use this MiTeC component suite and get the job done with less code.
Fri Feb 12 2021 12:13:03 GMT+0700 (Western Indonesia Time)
In this webinar, Embarcadero Delphi MVP Ian Barker writes and deploys an app that targets Windows, macOS, and Linux from one set of code using just Delphi 10.4 and the FirePower components from Woll2Woll software. Roy Woll (from Woll2Woll) will be taking part in a live Q & A session with Ian after the demonstration to answer your questions plus attendees can get a coupon for a discount on the Woll2Woll components demonstrated.
According to the developer, “Woll2Woll Firepower has tremendous advantages as it comes with the most intuitive and powerful components for RAD Studio FireMonkey. You can build one powerful and expressive app that runs smoothly on all your devices: iPhones and iPads, Android phones and tablets, Linux Systems (using FMXLinux), and MacBooks and Windows computers. You’ll be amazed how quickly you can develop without compromising on performance and capabilities. Not only will your user interface be intuitive and fast for each platform, it will be so much more effortless and enjoyable to develop. FirePower comes with expressive grids, edit controls, list boxes, combos, searching and filtering, validation rules, record panels, mobile extensions, enhanced sharing services, activity dialogs, and so much more.”
uses
JclFileUtils, JclStrings, JclSysUtils;
{ TForm1 }
procedure TForm1.FileListBox1Change(Sender: TObject);
var
FileName: TFileName;
I: Integer;
begin
FileName := FileListBox1.FileName;
Memo1.Lines.BeginUpdate;
try
Memo1.Lines.Clear;
if VersionResourceAvailable(FileName) then
with TJclFileVersionInfo.Create(FileName) do
try
for I := 0 to LanguageCount - 1 do
begin
LanguageIndex := I;
Memo1.Lines.Add(Format('[%s] %s', [LanguageIds[I], LanguageNames[I]]));
Memo1.Lines.Add(StringOfChar('-', 80));
Memo1.Lines.AddStrings(Items);
Memo1.Lines.Add(BinFileVersion);
Memo1.Lines.Add(OSIdentToString(FileOS));
Memo1.Lines.Add(OSFileTypeToString(FileType, FileSubType));
Memo1.Lines.Add('');
end;
Memo1.Lines.Add('Translations:');
for I := 0 to TranslationCount - 1 do
Memo1.Lines.Add(VersionLanguageId(Translations[I]));
Memo1.Lines.Add(BooleanToStr(TranslationMatchesLanguages));
finally
Free;
end;
finally
Memo1.Lines.EndUpdate;
end;
end;
JEDI Code Libraryは、Mozilla Public License(MPL)の条件に基づいて一般にリリースされているため、フリーウェア、シェアウェア、オープンソースおよび商用プロジェクトなど自由に使用できます。なお、エンバカデロではこのライブラリに関するテクニカルサポートサービスは提供しておりません。
Fri Feb 12 2021 03:24:01 GMT+0700 (Western Indonesia Time)
With Ramengo Bike you can view your data activities in real-time, like a real bike computer. You can view the details about the distances, times, speeds, pedaling cadence, heart rates, the route on a geographical map, graphic activity, the gradients of the track set, and more. The Android app is developed in Delphi.
According to the developer and the info listed on Google Play, “Using GPS and Bluetooth sensors for heart rate and speed / cadence, you can view”
Km Total, Total Time
Speed, Speed Max., Average Speed
BPM, BPM AVg% BPM, BPM Avg%,% Max BPM, BPM% Max Medium
Fri Feb 12 2021 03:17:43 GMT+0700 (Western Indonesia Time)
For many people, the desktop is simply the place where shortcuts and icons are located, without any real functionality. Nonetheless, you can benefit from all the empty space on your desktop by adding post-its, and Vov Sticky Notes is one of the apps that can help you do that and it is developed with Delphi. According to the developer, “Once you install it on your PC, the application automatically goes to the system tray, and you can right-click its icon when you want to create a new note. It basically opens a resizable window where you can paste text or start typing some of your important tasks. You can also drag and drop image files. Another handy function of Vov Sticky Notes is that you can create reminders to be displayed on a regular basis. You only need to choose the frequency interval, and then enter an appropriate message.” This is a nice looking Delphi app for sure.
Fri Feb 12 2021 03:14:23 GMT+0700 (Western Indonesia Time)
RightNote is a modern, tree based, information manager and notes organizer, that will help you keep on top of information overload and it is developed in Delphi. According to the developer, “You can easily store and file away, note clips of any kind, classify with tags, and then later find anything across all your notebooks with the super fast full text search engine. Packed with features and a modern and easy to use User Interface, RightNote puts all the information you need to deal with on a daily basis, at your finger tips.” I like the dark and light themes they use here.
Features include:
Different note types, including: Advanced text editor, Spreadsheet, Code editor, Journal and Calendar, Task lists, Webpages, Attachments and Links
Web clipper, Bookmarks, Tags, Global note history, Global tag search,
Full text search engine, Note and page password protection and encryption
Advanced tools to organize your notes: Floating tree dialog, Side by Side tree view, Page transfer dialog
Flexible import and export options supporting commonly used formats such as doc, docx, xlsx, rtf and html
Fri Feb 12 2021 03:03:43 GMT+0700 (Western Indonesia Time)
Galet Pocket come from a local game in the developer’s area and it is built with Delphi. According to the developer, “parents and kid, find pebble draw on it and hide it. My app is simple, you can set the position of your pebble and find pebble hide by others users. I got 500 register user and around 1000 pebble hide in one week.” Galet Pocket is an application that allows you to find pebbles thanks to the location added by users. Once your pebbles are decorated, you can save them on Galet Pocket before you hide them. The app is available from Google Play on Android devices. It provides a nice use of mapping from within a Delphi FireMonkey app.
Fri Feb 12 2021 02:59:37 GMT+0700 (Western Indonesia Time)
iCell is a point of sale software suite including management studio. It was made to provide technology solutions to the hospitality and allied industries and it is built with Delphi. According to the developer, “Our software suite boosts company performance through flexible reporting and a host of other smarts.” They feature a number of point of sale hardware and software solutions on their website including additional peripherals. This kind of point of sale system software is a vertical where Delphi really shines.
Fri Feb 12 2021 02:50:05 GMT+0700 (Western Indonesia Time)
HireTrack is an award winning rental & production management application for the Live Events industry and it is developed with Delphi. According to the developer, “HireTrack V1 was written in Delphi 1 used the BDE and was released in 1995, HireTrack V2, called HireTrack Eclipse was released in 1999 and was compiled in Delphi 5. Apart from refreshing the GUI, this was also a 32 bit update. HireTrack V3, called HireTrack NX was released in 2010. It was originally built in Delphi 5, but later was rebuilt in Delphi XE2 giving Unicode capability and the latest and current version was updated and built using Delphi Sydney. The BDE was replaced by the Nexus db engine. All versions have built on the previous version in terms of functionality and codebase but if you know where to look, there is still some code from the original version lurking about. HireTrack has had regular updates with bug fixes and new features – about 4 a year – since its first release 25 (and a half) years ago.”
Fri Feb 12 2021 02:47:56 GMT+0700 (Western Indonesia Time)
PAT is an additional Tool for a BMS-System like PRIVA and it is developed in Delphi. According to the developer, it has the following functionality:
– Import / Export of Values via CSV, Excel, Database, MODBUS, XML or JSON – Report-Designer incl. automatic creation of energy management-Reports – Event-System – Alarm / Message import and Statistic – Web-Interface via UniGUI – App for IOS and Android
The evaluation of measurement data for monitoring and energy values is becoming increasingly important. These requirements are usually only inadequately met by the applications integrated in the GLS systems.
Fri Feb 12 2021 02:42:17 GMT+0700 (Western Indonesia Time)
Powerful software emulator for the Univac 9200/9300, including original Univac assembler, linker and utilities and it is built with Delphi. According to the developer, “The UNIVAC 9000 series (9200, 9300, 9400, 9700) was a line of computers introduced by Sperry Rand in the mid-1960s to compete with the low end of the IBM System/360 series. The 9200 and 9300 (which differed only in CPU speed) implemented the same restricted 16-bit subset of the System/360 instruction set as the IBM 360/20. This emulator implements a full 9200/9300 set of instructions, card reader, card punch, printer and Uniserver VIC tape drives. It includes the original Univac assembler, linker, RPG compiler and various utilities. A broad range of original Univac manuals is given, including a programmed instruction guide.”
Fri Feb 12 2021 02:38:56 GMT+0700 (Western Indonesia Time)
Comalc Pro imports data from a file, manipulates and converts the data into an equivalent forms, evaluates the quantities or expressions or logic based on the original or newly converted data, and exports results into format and it is built in Delphi. According to the developer, “Import/Export and perform advanced analysis on IEEE/IEC Comtrade file format data (e.g. user-defined complex-number and logical expression evaluations and plots including discrete/fast/cosine fourier/filter transforms to model power system and related protection behavior). Simultaneous display/zoom multi-file data quickly (e.g. 300k x 1k rows/cols of structured data).”
Fri Feb 12 2021 02:34:01 GMT+0700 (Western Indonesia Time)
Usine is the ultimate Digital Workstation made for live, studio or installations and it is developed in Delphi. According to the developer, “the software can host VSTs/AU, process and route audio, MIDI, video, DMX, OSC and design personalized virtual control interfaces. Also it’s a modular environment, which means that, even if you can find many ready to use examples, the main goal is to create and customize your live set to fit it exactly to your needs. As a professional audio, video, and light modular software, Usine is different but finally you’ll realize that it is one of the most powerful software you can find.”
Thu Feb 11 2021 20:24:01 GMT+0700 (Western Indonesia Time)
MQTT stands for MQ Telemetry Transport and it is a specification for a publish-subscribe protocol for communication between devices.
When we are talking about Lightweight and Efficient, MQTT Protocol is a very good example. MQTT clients are very small, require minimal resources so can be used on small microcontrollers. MQTT message headers are small to optimize network bandwidth.
Another very important point is the Reliability of message delivery for many IoT use cases. This is why MQTT has 3 defined quality of service levels: 0 – at most once, 1- at least once, 2 – exactly once.
MQTT also provides Bi-directional Communications. To be more specific it allows for messaging between device to cloud and cloud to device. This makes for easy broadcasting messages to groups of things.
Supporting Unreliable Networks is tough. Many IoT devices connect over unreliable cellular networks. MQTT’s support for persistent sessions reduces the time to reconnect the client with the broker.
Another important feature of MQTT is scaling to Millions of Things. It can scale to connect with millions of IoT devices.
With the best Security enabled, MQTT makes it easy to encrypt messages using TLS and authenticate clients using modern authentication protocols, such as OAuth.
If you want to try the Delphi MQTT library, please follow the link below:
Thu Feb 11 2021 20:12:53 GMT+0700 (Western Indonesia Time)
According to Gartner, over 90% of deployed data lakes will become useless as they are overwhelmed with information assets captured for uncertain use cases. This is indeed, an alarming situation. While companies are spending time and money to unify their data, how does one find value in that unified data? How can companies garner valuable insights from their data?
The idea of the data lake has been gaining traction since 2011-2012. At the time, organizations were enticed with the prospect of analyzing big data on the fly and boosting business agility. This was further cemented by the cheap availability of cloud storage.
But the promises were not as rosy and simple to fulfil. Data scientists were faced with the challenge of replicating results of testbeds to real-world scenarios. Soon, they were faced with a handful of other challenges including and not limited to data ingestion, preparation for quick querying and formation of data swamps.
Big data, without a shadow of a doubt, is an invaluable resource, but it is extremely complex at the same time–a fact that platform and service providers often do not admit. The inherent complexities in the architecture for consolidating big data from disparate sources (both batch and streaming) into a data lake and using it to achieve desired results, has given rise to data lake automation. It is a practice that aims to eliminate most of the challenges by equipping data lake platforms with the power to self-heal and self-tune, create partitions for quick querying, and much more.
Data Lake Trends
A data lake allows organizations to store huge amounts of diverse datasets without having to build a model first.
Data lakes are especially useful when data managers are looking for ways to capture and store data from a variety of sources in various formats. In a lot of instances, data lakes are considered cost effective, and are used with the intent to store data for exploratory analysis, maintain the data quality and quantity simultaneously, and help eliminate disparities or incompatibilities when it comes to legacy data storage systems.
(detchana-wangkheeree/Shutterstock)
Having said that, while many enterprises might be thinking about incorporating data lakes, they struggle with identifying what to consider before taking the journey. Managing data lakes can be an extremely complex process; and it is important to streamline data discovery, provide insights delivery and administration of data lake platforms such as Microsoft Azure, Snowflake, Hadoop, Google Cloud, and AWS, while at the same time help maintain security and privacy measures to safeguard your data.
Since the pandemic started, we’re seeing companies accelerate their digital transformation journey. They are looking at a faster transition toward the cloud and becoming digital. However, in order to do that they need the right data strategy and roadmap, capability to drive analytical insights, seamless transition to cloud platforms, and drive automation to instrument these insights.
Impediments to Realizing Data Lake Potential
While most enterprises understand that concepts such as data lakes are important, let’s face it–there are many problems companies encounter when it comes to data lake deployment.
For one, many data scientists underestimate the complexities of developing a data lake and the expertise required to overcome some of those complexities. Companies also face the challenge of overcoming the ongoing costs attached. Difficulty in analyzing diverse data sets, data security, data silos are all real-challenges that companies today face.
Data lake ingestion is a critical component – Consolidating high volumes of data from various sources into a data lake is a difficult task leading to inconsistencies with formats of data. To add to it, rapidly changing data makes the process even more difficult. Many face lags with data updating, and new insights being produced regularly.
Agility gets compromised – Today, the problem with big data is the size of data sets and streamlining databases which makes it difficult for the data lakes to process data efficiently.
Preparation of dataand accessibility – The problem arises when data is lumped together and there is not enough idea as to what needs to be linked where, and the types of information that needs to be available to everyone in an organization.
Making Data Lakes More Performant and Useful
Nowadays, a more modern approach is required to make data lakes performant. This can be done by enterprises by automating their data pipeline–right from data ingestion, to continuous updates, providing faster time-to-value to creating analytics-ready data sets.
With automation, the challenges that emerge with simply dumping data into lakes turning them into data swamps are done away with. Data swamps are undocumented and difficult to leverage and navigate. Automation provides an agile approach to data lake development helping companies get rid of data swamps, implement ready-reference architectures, onboard use cases quicker, automate legwork, ensure better governance and establish a data-friendly bottom-line as well as culture for an enterprise.
For example, in the telecommunications industry, automation of data lakes can help handle repetitive tasks with respect to customer relationship building and management, automate error remediation, create a single source of truth, and improve service quality.
Now with automation, it is becoming easier to leverage the compute power of data lakes helping enterprises simplify much of the data lake development and management process. By automating data lakes wherever possible – either when it comes to data ingestion or data preparation, as well as making data query-ready, enterprises can look at reviving their data lakes and bring back some of its lost appeal.
Automation Through Modern and Scalable Data Architectures
When it comes to considering deployment environments and data formats, many enterprises look at running hybrid data environments–which are becoming increasingly popular today–while others consider service providers and incorporating data lakes as-a-service.
An emerging category, data lakes as-a-service, are useful for enterprises who want to consider pre-built cloud services and have a service provider install and manage the technology for them. What this means for enterprises is that they are provided with:
automated provisioning
advanced analytics on data of any size and ingest real-time data at scale
data lake strategy development and roadmap
scalable data storage
data integration, access and services
data lake implementation and go-live enablement
metadata management and governance
end-to-end data security with encryption
The end goal for enterprises is generating value from lakes, and while some have succeeded, many have struggled with identifying the right recipe for success due to software processes issues or becoming overwhelmed with the size of their lakes. However, a lot is changing now due to automation, modern BI tools, and effective data management architectures. And with enterprises having specific goals in mind, there is now a better understanding of what they, too, are looking for at the bottom of the lake. It is clear that architectures will continue to evolve based on customer and enterprise data landscape demands.
In years to come, data lakes will continue to evolve and play an increasingly important role in enterprise data strategies. Organizations need reliable next-gen technology solutions in-line with their business vision and now with innovative approaches to data management, enterprises can realize their true potential by taking into account effective data architecture, digital maturity and hosting environments.
About the author: Chetan Alsisaria is the CEO & co-founder of Polestar Solutions & Services Pvt Ltd. Over the past 17 years, Alsisaria has led many technology-driven business transformation engagements for clients across the globe for Fortune 500 companies, large/mid-size organizations, new-age companies as well as in the government sector. Chetan’s area of expertise lies in identifying strategic growth areas, forming alliances, building high potential motivated teams, and delivering excellence in the areas of data analytics and enterprise performance management.
Thu Feb 11 2021 19:00:10 GMT+0700 (Western Indonesia Time)
The security community is continuously changing, growing, and learning from each other to better position the world against cyber threats. In the latest post from our new Voice of the Community blog series, Microsoft Product Marketing Manager Natalia Godyla talks with Dave Kennedy, Founder and Chief Technology Officer at Binary Defense. Dave shares his insights on security operations—what these teams need to work effectively, best practices for maturing the security operations center (SOC), as well as the biggest security challenges in the years to come.
Natalia: What are the standard tools, roles, frameworks, and services for a security operations team? What are the basic elements a SecOps team needs to succeed?
Dave: Your security operations team must have visibility into your infrastructure, both on and off-premises. Visibility is key because many of these attacks start with one compromised asset or one compromised credential. They spread across the network and in many cases, they wreak a lot of damage. Your endpoints, network infrastructure, and cloud environments are where a lot of these issues happen. I recommend starting with high-risk areas like your endpoints.
Then, you need somewhere to ingest that data, such as security information and event management systems like Microsoft Azure Sentinel, and to go through log analysis and determine if anything has been compromised.
Also, frameworks like the MITRE ATT&CK framework are a great baseline of saying, well, here are specific attacks that we’ve seen in the wild that are mapped to specific adversaries that are in our industry vertical. That can help you prioritize those, get better at detection, and make sure you have the right logs coming into your environment to build detections.
Natalia: How can a team operationalize the MITRE ATT&CK framework?
Dave: When people first look at the MITRE ATT&CK framework, they freak out because it’s so big, but it’s a treasure trove of information. Everybody was focused on a castle mentality of being able to protect everything but what happens when an attacker is in your environment? Protection is still very important and you want to have protective mechanisms in place, but protection takes time and requires cultural changes in many cases. If you’re doing something like multifactor authentication, you have to communicate that to users.
The MITRE ATT&CK framework tells you what happens when attackers have gotten around your preventive controls. What happens when they execute code onto a system and take other actions that allow them to either extract additional information or move to different systems through lateral movement or post-exploitation scenarios and get access to the data? The MITRE ATT&CK framework is a way to conceptualize exactly what’s happening from an attacker’s standpoint and to build detections around those attack patterns.
With the damage we see, it’s usually several hours, days, or months that an attacker has had access to an environment. If we can shave that time down and detect them in the first few minutes or the first few hours of an attack and shut them down, we’ve saved our company a substantial amount of damage. It’s a framework to help you understand what’s happening in your environment and when unusual activities are occurring so you can respond much more effectively.
Natalia: How much of the MITRE ATT&CK framework should a security team build into their detections? How much should they rely on existing tools to map the framework?
Dave: Many tools today have already done a lot of mapping to things like the MITRE ATT&CK framework, but it’s not comprehensive. If you have an endpoint detection and response product, it may cover only 20 percent of the MITRE ATT&CK framework. Mapping your existing tools and technology to the MITRE ATT&CK framework is a very common practice. For instance, you may have an email gateway that uses sandboxing virtualization techniques that detonate potential malware to see whether it’s effective. That’s one component of your technology stack that can help cover certain components of the MITRE ATT&CK framework. You might have web content filtering that covers a different component of the framework, and then you have endpoint detection and responses (EDRs) that cover a percentage of the endpoint detection pieces.
Technology products can help you shave away the amount of effort that goes into the MITRE ATT&CK framework. It’s really important, though, that organizations map those out to understand where they have gaps and weaknesses. Maybe they need additional technology for better visibility into their environment. I’m a huge fan of the Windows systems service, System Monitor (Sysmon). If you talk to any incident responder, they’ll tell you that if they have access to Sysmon data logs, that’s a treasure trove of information from a threat hunting and incident response perspective.
It’s also important to look at it from an adversary perspective. Not every single adversary in the world wants to target your organization or business. If you’re in manufacturing, for instance, you’re not going to be a target of all adversaries. Look at what the adversaries do and what type of industry vertical they’re targeting so you don’t have to do everything in the MITRE ATT&CK framework. You can whittle the framework down to what’s important for you and build your detections based on which adversaries are most likely to target your organization.
Natalia: If a team has all the basics down and wants to mature their SecOps practices, what do you suggest?
Dave: Most security operations centers are very reactive. Mature organizations are moving toward more proactive hunting or threat hunting. A good example is if you’re sending all of your logs through Azure Sentinel, you can do things like Kusto Query Language and queries in analysis and data sets to look for unusual activity. These organizations go through command line arguments, service creations, parent-child process relationships, or Markov chaining, where you can look at unusual deviations of parent-child process relationships or unusual network activity.
It’s a continual progression starting off with the basics and becoming more advanced over time as you run through new emulation criteria or simulation criteria through either red teaming or automation tools. They can help you get good baselines of your environment and look for unusual traffic that may indicate a potential compromise. Adversary emulations are where you’re imitating a specific adversary attacker through known techniques discovered through data breaches. For example, we look at what happened with the SolarWinds supply chain attack—and kudos to Microsoft for all the research out there—and we say, here are the techniques these specific actors were using, and let’s build detections off of those so they can’t use them again.
More mature organizations already have that in place, and they’re moving toward what we call adversary simulation, where you take a look at an organization’s threat models and you build your attacks and techniques off of how those adversaries would operate. You don’t do it by using the same type of techniques that have previously been discovered. You’re trying to simulate what an attacker would do in an environment and can a blue team identify those.
Natalia: What are best practices for threat hunting?
Dave: Threat hunting varies based on timing and resources. It doesn’t mean you have to have dedicated resources. Threat hunting can be an exercise you conduct once a week, once a month, or once a quarter. It involves going through your data and looking for unusual activity. Look at all service creations. Look at all your command line arguments that are being passed. A large percentage of the MITRE ATT&CK framework can be covered just by parent-child process relationships and command line auditing in the environment. Look at East to West traffic, not just North to South. Look at all your audit logs. Go through Domain Name System (DNS traffic).
For instance, a user was using Outlook and then clicked on an email that opened an Excel document that triggered a macro that then called PowerShell or CMD EXE. That’s an unusual activity that you wouldn’t expect to see from a normal user so let’s hone in on that and figure out what occurred.
You can also conduct more purple teaming engagements, where you have a red team launch attacks and detection teams look through the logs at the same time to build better detections or see where you might have gaps in visibility. Companies that have threat hunting teams make it very difficult for red teamers to get around the different landmines that they’ve laid across the network.
Natalia: What should an incident response workflow look like?
Dave: An alert or unusual activity during a threat hunting exercise is usually raised to somebody to do an analysis. A SOC analyst typically has between 30 seconds and four minutes per alarm to determine whether the alarm is a false positive or something they need to analyze. Obviously, what stands out are things like obfuscation techniques, such as where you have PowerShell with a bunch of code that looks very unusual and obfuscation to try to evade endpoint protection products. Some of the more confusing ones are things like living off the land, which are attacks that leverage legitimate applications that are code signed by the operating system to download files and execute in the future.
A research phase kicks off to see what’s actually going on. If it’s determined that there is malicious activity, usually that’s when incident response kicks in. How bad is it? Have they moved to other systems? Let’s get this machine off the network and figure out everything that’s happening. Let’s do memory analysis. Let’s figure out who the actual attacker was. Can we combine this with red intelligence and determine the specific adversary? What are their capabilities? You start to build the timeline to ensure that you have all the right data and to determine if it’s a major breach or self-contained to one individual system.
We ran several incident response scenarios for customers that were impacted by the supply chain attacks on SolarWinds and the biggest challenge for the customers was their logs didn’t go back that far so it was very difficult for them to say definitively with evidence, that they know what happened.
Natalia: What does an incident responder need to succeed?
Dave: I’d strongly recommend doing an incident response readiness assessment for your organization. I also recommend centralized logging—whether that’s a security information and event management (SIEM) or a data analytics tool or a data lake—that you can comb through. I’m a huge advocate of Sysmon. You can do power execution, command line auditing, DNS traffic, process injection, and parent-child process relationships. I’d also suggest network logs. If you can do full packet captures, which not a lot of organizations can do, that’s also great. If you can pull data packets coming from a secure sockets layer (SSL) or transport layer security (TLS) and do remote memory acquisition, that’s also really important. Can we retrieve artifacts from systems in a very consistent way?
Tabletop exercises can also get executives and IT on the same page about how to handle incidents and work together. Running through very specific types of scenarios can help you figure out where you have gaps or weaknesses. When I was the Chief Security Officer at Diebold, we would run through three to four tabletop exercises a year and include our senior leadership, like our CEO and CFO, twice a year. It was eye-opening for them because they never really understood what goes into incident response and what can happen from a cyber perspective. We’d run through actual simulations and scenarios of very specific attacks and see how they would respond. Those types of scenarios really help build your team’s understanding and determine where you may need better communication, better tooling, or better ways to respond.
Natalia: What other strategies can security operators implement to try to avoid attacks?
Dave: When you look at layered defense, always improving protection is key. You don’t want to just focus on detection because you’re going to be in firefighting mode all the time. The basics really are a big deal: things like multifactor authentication, patch management, and security architecture.
Reducing the attack surface is important, such as with application control and allowed application lists. Application control is probably one of the most effective ways of shutting down most attacks out there today because you have a good baseline of your organization. That applies very consistently to things like the Zero Trust model. Become more of a service provider for your organization versus providing everything for your organization. Reducing your attack surface will eliminate the noise that incident responders or SOC analysts must deal with and allow them to focus on a lot of the high-fidelity type things that we want to see.
One of the things that I see continuously going into a lot of organizations is that they’re just always in firefighting mode, 90 percent of their alarms are false positives, and they’re in alarm fatigue. Their security operations center isn’t improving on detections. You really need somebody on the strategy side to come in and say: Can we lock our users down in a way that doesn’t hinder the business, but also lowers the attack surface?
Natalia: How does vulnerability assessment strategy fit into a SOC strategy?
Dave: Program vulnerabilities and exposures are key opportunities that attackers will use. When we look at historic data breaches, those that use direct exploitation and not phishing were using common vulnerabilities and exposures (CVE) typically of six months or older that allowed them access to a specific system. That makes it really important to reduce attack surfaces and understand where vulnerabilities are so we can make it a lot more difficult for attackers to get in.
It’s not a zero-day attack that’s hitting companies today. It’s out-of-date systems. It’s not patching appropriately. A lot of companies will do well on the operating system side. They’ll patch their Windows machines, their Linux machines, and Apple. But they fail really hard with the third-party applications and especially the web application tier of the house—middleware, microservices. In almost every case, it comes down to ownership of the application. A lot of times, IT will own the operating system platforms and the infrastructure that it’s on, but business owners typically sponsor those applications and so ownership becomes a very murky area. Is it the business owners that own the updates of the applications or does IT? Make sure you have clear owners in charge of making sure patches go out regularly.
If you’re not going through regular vulnerability assessments and looking for the vulnerabilities in your environment, you’re very predisposed to a data breach that attackers would leverage based on missing patches or missing specific security fixes. The first few stages of an attack are the most critical because that’s where most organizations have built their defenses. In the latter phases of post-exploitation, especially as you get to the exfiltration components, most organizations don’t have good detection capabilities. It’s really important to have those detection mechanisms in place ahead of time and ensure those systems are patched.
Natalia: We often discuss the challenges facing security today. Let’s take a different approach. What gives you hope?
Dave: What gives me hope is the shift in security. Ten years ago, we would go into organizations from a penetration testing perspective and just destroy these companies. And then the next year, we’d go in and we’d destroy these companies again. Their focus was always on the technical vulnerabilities and not on what happens after attackers are in your castle. The industry has really shifted toward the mindset of we have to get better at looking for deviations of patterns of behavior to be able to respond much more effectively. The industry is definitely tracking in the right direction, and that really gives me hope.
Learn how Microsoft Security solutions can help modernize Security Operations.
To learn more about Microsoft Security solutions visit our website. Bookmark the Security blog to keep up with our expert coverage on security matters. Also, follow us at @MSFTSecurity for the latest news and updates on cybersecurity.
Thu Feb 11 2021 18:00:23 GMT+0700 (Western Indonesia Time)
It can be challenging to develop a neural network predictive model for a new dataset.
One approach is to first inspect the dataset and develop ideas for what models might work, then explore the learning dynamics of simple models on the dataset, then finally develop and tune a model for the dataset with a robust test harness.
This process can be used to develop effective neural network models for classification and regression predictive modeling problems.
In this tutorial, you will discover how to develop a Multilayer Perceptron neural network model for the ionosphere binary classification dataset.
After completing this tutorial, you will know:
How to load and summarize the ionosphere dataset and use the results to suggest data preparations and model configurations to use.
How to explore the learning dynamics of simple MLP models on the dataset.
How to develop robust estimates of model performance, tune model performance, and make predictions on new data.
Let’s get started.
How to Develop a Neural Net for Predicting Disturbances in the Ionosphere Photo by Sergey Pesterev, some rights reserved.
Tutorial Overview
This tutorial is divided into four parts; they are:
Ionosphere Binary Classification Dataset
Neural Network Learning Dynamics
Evaluating and Tuning MLP Models
Final Model and Make Predictions
Ionosphere Binary Classification Dataset
The first step is to define and explore the dataset.
We will be working with the “Ionosphere” standard binary classification dataset.
This dataset involves predicting whether a structure is in the atmosphere or not given radar returns.
We can see that the values are all numeric and perhaps in the range [-1, 1]. This suggests some type of scaling would probably not be needed.
We can also see that the label is a string (“g” and “b“), suggesting that the values will need to be encoded to 0 and 1 prior to fitting a model.
We can load the dataset as a pandas DataFrame directly from the URL; for example:
# load the ionosphere dataset and summarize the shape
from pandas import read_csv
# define the location of the dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv'
# load the dataset
df = read_csv(url, header=None)
# summarize shape
print(df.shape)
Running the example loads the dataset directly from the URL and reports the shape of the dataset.
In this case, we can see that the dataset has 35 variables (34 input and one output) and that the dataset has 351 rows of data.
This is not many rows of data for a neural network and suggests that a small network, perhaps with regularization, would be appropriate.
It also suggests that using k-fold cross-validation would be a good idea given that it will give a more reliable estimate of model performance than a train/test split and because a single model will fit in seconds instead of hours or days with the largest datasets.
(351, 35)
Next, we can learn more about the dataset by looking at summary statistics and a plot of the data.
# show summary statistics and plots of the ionosphere dataset
from pandas import read_csv
from matplotlib import pyplot
# define the location of the dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv'
# load the dataset
df = read_csv(url, header=None)
# show summary statistics
print(df.describe())
# plot histograms
df.hist()
pyplot.show()
Running the example first loads the data before and then prints summary statistics for each variable.
We can see that the mean values for each variable are in the tens, with values ranging from -1 to 1. This confirms that scaling the data is probably not required.
A histogram plot is then created for each variable.
We can see that many variables have a Gaussian or Gaussian-like distribution.
We may have some benefit in using a power transform on each variable in order to make the probability distribution less skewed which will likely improve model performance.
Histograms of the Ionosphere Classification Dataset
Now that we are familiar with the dataset, let’s explore how we might develop a neural network model.
Neural Network Learning Dynamics
We will develop a Multilayer Perceptron (MLP) model for the dataset using TensorFlow.
We cannot know what model architecture of learning hyperparameters would be good or best for this dataset, so we must experiment and discover what works well.
Given that the dataset is small, a small batch size is probably a good idea, e.g. 16 or 32 rows. Using the Adam version of stochastic gradient descent is a good idea when getting started as it will automatically adapts the learning rate and works well on most datasets.
Before we evaluate models in earnest, it is a good idea to review the learning dynamics and tune the model architecture and learning configuration until we have stable learning dynamics, then look at getting the most out of the model.
We can do this by using a simple train/test split of the data and review plots of the learning curves. This will help us see if we are over-learning or under-learning; then we can adapt the configuration accordingly.
First, we must ensure all input variables are floating-point values and encode the target label as integer values 0 and 1.
...
# ensure all data are floating point values
X = X.astype('float32')
# encode strings to integer
y = LabelEncoder().fit_transform(y)
Next, we can split the dataset into input and output variables, then into 67/33 train and test sets.
...
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# split into train and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
We can define a minimal MLP model. In this case, we will use one hidden layer with 10 nodes and one output layer (chosen arbitrarily). We will use the ReLU activation function in the hidden layer and the “he_normal” weight initialization, as together, they are a good practice.
The output of the model is a sigmoid activation for binary classification and we will minimize binary cross-entropy loss.
...
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy')
We will fit the model for 200 training epochs (chosen arbitrarily) with a batch size of 32 because it is a small dataset.
We are fitting the model on raw data, which we think might be a good idea, but it is an important starting point.
...
# fit the model
history = model.fit(X_train, y_train, epochs=200, batch_size=32, verbose=0, validation_data=(X_test,y_test))
At the end of training, we will evaluate the model’s performance on the test dataset and report performance as the classification accuracy.
...
# predict test set
yhat = model.predict_classes(X_test)
# evaluate predictions
score = accuracy_score(y_test, yhat)
print('Accuracy: %.3f' % score)
Finally, we will plot learning curves of the cross-entropy loss on the train and test sets during training.
Tying this all together, the complete example of evaluating our first MLP on the ionosphere dataset is listed below.
# fit a simple mlp model on the ionosphere and review learning curves
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# ensure all data are floating point values
X = X.astype('float32')
# encode strings to integer
y = LabelEncoder().fit_transform(y)
# split into train and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy')
# fit the model
history = model.fit(X_train, y_train, epochs=200, batch_size=32, verbose=0, validation_data=(X_test,y_test))
# predict test set
yhat = model.predict_classes(X_test)
# evaluate predictions
score = accuracy_score(y_test, yhat)
print('Accuracy: %.3f' % score)
# plot learning curves
pyplot.title('Learning Curves')
pyplot.xlabel('Epoch')
pyplot.ylabel('Cross Entropy')
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='val')
pyplot.legend()
pyplot.show()
Running the example first fits the model on the training dataset, then reports the classification accuracy on the test dataset.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the model achieved an accuracy of about 88 percent, which is a good baseline in performance that we might be able to improve upon.
Accuracy: 0.888
Line plots of the loss on the train and test sets are then created.
We can see that the model appears to converge but has overfit the training dataset.
Learning Curves of Simple MLP on Ionosphere Dataset
Let’s try increasing the capacity of the model.
This will slow down learning for the same learning hyperparameters and may offer better accuracy.
We will add a second hidden layer with eight nodes, chosen arbitrarily.
...
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1, activation='sigmoid'))
The complete example is listed below.
# fit a deeper mlp model on the ionosphere and review learning curves
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# ensure all data are floating point values
X = X.astype('float32')
# encode strings to integer
y = LabelEncoder().fit_transform(y)
# split into train and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy')
# fit the model
history = model.fit(X_train, y_train, epochs=200, batch_size=32, verbose=0, validation_data=(X_test,y_test))
# predict test set
yhat = model.predict_classes(X_test)
# evaluate predictions
score = accuracy_score(y_test, yhat)
print('Accuracy: %.3f' % score)
# plot learning curves
pyplot.title('Learning Curves')
pyplot.xlabel('Epoch')
pyplot.ylabel('Cross Entropy')
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='val')
pyplot.legend()
Running the example first fits the model on the training dataset, then reports the accuracy on the test dataset.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see a slight improvement in accuracy to about 93 percent, although the high variance of the train/test split means that this evaluation is not reliable.
Accuracy: 0.931
Learning curves for the loss on the train and test sets are then plotted. We can see that the model still appears to show an overfitting behavior.
Learning Curves of Deeper MLP on the Ionosphere Dataset
Finally, we can try a wider network.
We will increase the number of nodes in the first hidden layer from 10 to 50, and in the second hidden layer from 8 to 10.
This will add more capacity to the model, slow down learning, and may further improve results.
...
# define model
model = Sequential()
model.add(Dense(50, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(10, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1, activation='sigmoid'))
We will also reduce the number of training epochs from 200 to 100.
...
# fit the model
history = model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=0, validation_data=(X_test,y_test))
The complete example is listed below.
# fit a wider mlp model on the ionosphere and review learning curves
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# ensure all data are floating point values
X = X.astype('float32')
# encode strings to integer
y = LabelEncoder().fit_transform(y)
# split into train and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(50, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(10, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy')
# fit the model
history = model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=0, validation_data=(X_test,y_test))
# predict test set
yhat = model.predict_classes(X_test)
# evaluate predictions
score = accuracy_score(y_test, yhat)
print('Accuracy: %.3f' % score)
# plot learning curves
pyplot.title('Learning Curves')
pyplot.xlabel('Epoch')
pyplot.ylabel('Cross Entropy')
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='val')
pyplot.legend()
pyplot.show()
Running the example first fits the model on the training dataset, then reports the accuracy on the test dataset.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, the model achieves a better accuracy score, with a value of about 94 percent. We will ignore model performance for now.
Accuracy: 0.940
Line plots of the learning curves are created showing that the model achieved a reasonable fit and had more than enough time to converge.
Learning Curves of Wider MLP on the Ionosphere Dataset
Now that we have some idea of the learning dynamics for simple MLP models on the dataset, we can look at evaluating the performance of the models as well as tuning the configuration of the models.
Evaluating and Tuning MLP Models
The k-fold cross-validation procedure can provide a more reliable estimate of MLP performance, although it can be very slow.
This is because k models must be fit and evaluated. This is not a problem when the dataset size is small, such as the ionosphere dataset.
We can use the StratifiedKFold class and enumerate each fold manually, fit the model, evaluate it, and then report the mean of the evaluation scores at the end of the procedure.
# prepare cross validation
kfold = KFold(10)
# enumerate splits
scores = list()
for train_ix, test_ix in kfold.split(X, y):
# fit and evaluate the model...
...
...
# summarize all scores
print('Mean Accuracy: %.3f (%.3f)' % (mean(scores), std(scores)))
We can use this framework to develop a reliable estimate of MLP model performance with a range of different data preparations, model architectures, and learning configurations.
It is important that we first developed an understanding of the learning dynamics of the model on the dataset in the previous section before using k-fold cross-validation to estimate the performance. If we started to tune the model directly, we might get good results, but if not, we might have no idea of why, e.g. that the model was over or under fitting.
If we make large changes to the model again, it is a good idea to go back and confirm that the model is converging appropriately.
The complete example of this framework to evaluate the base MLP model from the previous section is listed below.
# k-fold cross-validation of base model for the ionosphere dataset
from numpy import mean
from numpy import std
from pandas import read_csv
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# ensure all data are floating point values
X = X.astype('float32')
# encode strings to integer
y = LabelEncoder().fit_transform(y)
# prepare cross validation
kfold = StratifiedKFold(10)
# enumerate splits
scores = list()
for train_ix, test_ix in kfold.split(X, y):
# split data
X_train, X_test, y_train, y_test = X[train_ix], X[test_ix], y[train_ix], y[test_ix]
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(50, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(10, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy')
# fit the model
model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=0)
# predict test set
yhat = model.predict_classes(X_test)
# evaluate predictions
score = accuracy_score(y_test, yhat)
print('>%.3f' % score)
scores.append(score)
# summarize all scores
print('Mean Accuracy: %.3f (%.3f)' % (mean(scores), std(scores)))
Running the example reports the model performance each iteration of the evaluation procedure and reports the mean and standard deviation of classification accuracy at the end of the run.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the MLP model achieved a mean accuracy of about 93.4 percent.
We will use this result as our baseline to see if we can achieve better performance.
Next, let’s try adding regularization to reduce overfitting of the model.
In this case, we can add dropout layers between the hidden layers of the network. For example:
...
# define model
model = Sequential()
model.add(Dense(50, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dropout(0.4))
model.add(Dense(10, activation='relu', kernel_initializer='he_normal'))
model.add(Dropout(0.4))
model.add(Dense(1, activation='sigmoid'))
The complete example of the MLP model with dropout is listed below.
# k-fold cross-validation of the MLP with dropout for the ionosphere dataset
from numpy import mean
from numpy import std
from pandas import read_csv
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# ensure all data are floating point values
X = X.astype('float32')
# encode strings to integer
y = LabelEncoder().fit_transform(y)
# prepare cross validation
kfold = StratifiedKFold(10)
# enumerate splits
scores = list()
for train_ix, test_ix in kfold.split(X, y):
# split data
X_train, X_test, y_train, y_test = X[train_ix], X[test_ix], y[train_ix], y[test_ix]
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(50, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dropout(0.4))
model.add(Dense(10, activation='relu', kernel_initializer='he_normal'))
model.add(Dropout(0.4))
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy')
# fit the model
model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=0)
# predict test set
yhat = model.predict_classes(X_test)
# evaluate predictions
score = accuracy_score(y_test, yhat)
print('>%.3f' % score)
scores.append(score)
# summarize all scores
print('Mean Accuracy: %.3f (%.3f)' % (mean(scores), std(scores)))
Running reports the mean and standard deviation of the classification accuracy at the end of the run.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the MLP model with dropout achieves better results with an accuracy of about 94.6 percent compared to 93.4 percent without dropout
Mean Accuracy: 0.946 (0.043)
Finally, we will try reducing the batch size from 32 down to 8.
This will result in more noisy gradients and may also slow down the speed at which the model is learning the problem.
...
# fit the model
model.fit(X_train, y_train, epochs=100, batch_size=8, verbose=0)
The complete example is listed below.
# k-fold cross-validation of the MLP with dropout for the ionosphere dataset
from numpy import mean
from numpy import std
from pandas import read_csv
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# ensure all data are floating point values
X = X.astype('float32')
# encode strings to integer
y = LabelEncoder().fit_transform(y)
# prepare cross validation
kfold = StratifiedKFold(10)
# enumerate splits
scores = list()
for train_ix, test_ix in kfold.split(X, y):
# split data
X_train, X_test, y_train, y_test = X[train_ix], X[test_ix], y[train_ix], y[test_ix]
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(50, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dropout(0.4))
model.add(Dense(10, activation='relu', kernel_initializer='he_normal'))
model.add(Dropout(0.4))
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy')
# fit the model
model.fit(X_train, y_train, epochs=100, batch_size=8, verbose=0)
# predict test set
yhat = model.predict_classes(X_test)
# evaluate predictions
score = accuracy_score(y_test, yhat)
print('>%.3f' % score)
scores.append(score)
# summarize all scores
print('Mean Accuracy: %.3f (%.3f)' % (mean(scores), std(scores)))
Running reports the mean and standard deviation of the classification accuracy at the end of the run.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the MLP model with dropout achieves slightly better results with an accuracy of about 94.9 percent.
Mean Accuracy: 0.949 (0.042)
We will use this configuration as our final model.
We could continue to test alternate configurations to the model architecture (more or fewer nodes or layers), learning hyperparameters (more or fewer batches), and data transforms.
I leave this as an exercise; let me know what you discover. Can you get better results?
Post your results in the comments below, I’d love to see what you get.
Next, let’s look at how we might fit a final model and use it to make predictions.
Final Model and Make Predictions
Once we choose a model configuration, we can train a final model on all available data and use it to make predictions on new data.
In this case, we will use the model with dropout and a small batch size as our final model.
We can prepare the data and fit the model as before, although on the entire dataset instead of a training subset of the dataset.
...
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# ensure all data are floating point values
X = X.astype('float32')
# encode strings to integer
le = LabelEncoder()
y = le.fit_transform(y)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(50, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dropout(0.4))
model.add(Dense(10, activation='relu', kernel_initializer='he_normal'))
model.add(Dropout(0.4))
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy')
We can then use this model to make predictions on new data.
First, we can define a row of new data.
...
# define a row of new data
row = [1,0,0.99539,-0.05889,0.85243,0.02306,0.83398,-0.37708,1,0.03760,0.85243,-0.17755,0.59755,-0.44945,0.60536,-0.38223,0.84356,-0.38542,0.58212,-0.32192,0.56971,-0.29674,0.36946,-0.47357,0.56811,-0.51171,0.41078,-0.46168,0.21266,-0.34090,0.42267,-0.54487,0.18641,-0.45300]
Note: I took this row from the first row of the dataset and the expected label is a ‘g‘.
We can then make a prediction.
...
# make prediction
yhat = model.predict_classes([row])
Then invert the transform on the prediction, so we can use or interpret the result in the correct label.
...
# invert transform to get label for class
yhat = le.inverse_transform(yhat)
And in this case, we will simply report the prediction.
Tying this all together, the complete example of fitting a final model for the ionosphere dataset and using it to make a prediction on new data is listed below.
# fit a final model and make predictions on new data for the ionosphere dataset
from pandas import read_csv
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# ensure all data are floating point values
X = X.astype('float32')
# encode strings to integer
le = LabelEncoder()
y = le.fit_transform(y)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(50, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dropout(0.4))
model.add(Dense(10, activation='relu', kernel_initializer='he_normal'))
model.add(Dropout(0.4))
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy')
# fit the model
model.fit(X, y, epochs=100, batch_size=8, verbose=0)
# define a row of new data
row = [1,0,0.99539,-0.05889,0.85243,0.02306,0.83398,-0.37708,1,0.03760,0.85243,-0.17755,0.59755,-0.44945,0.60536,-0.38223,0.84356,-0.38542,0.58212,-0.32192,0.56971,-0.29674,0.36946,-0.47357,0.56811,-0.51171,0.41078,-0.46168,0.21266,-0.34090,0.42267,-0.54487,0.18641,-0.45300]
# make prediction
yhat = model.predict_classes([row])
# invert transform to get label for class
yhat = le.inverse_transform(yhat)
# report prediction
print('Predicted: %s' % (yhat[0]))
Running the example fits the model on the entire dataset and makes a prediction for a single row of new data.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the model predicted a “g” label for the input row.
Predicted: g
Further Reading
This section provides more resources on the topic if you are looking to go deeper.
Thu Feb 11 2021 17:00:05 GMT+0700 (Western Indonesia Time)
One year ago, we reported the steady increase in the use of web shells in attacks worldwide. The latest Microsoft 365 Defender data shows that this trend not only continued, it accelerated: every month from August 2020 to January 2021, we registered an average of 140,000 encounters of these threats on servers, almost double the 77,000 monthly average we saw last year.
Figure 1. Web shell encounters on servers
The escalating prevalence of web shells may be attributed to how simple and effective they can be for attackers. A web shell is typically a small piece of malicious code written in typical web development programming languages (e.g., ASP, PHP, JSP) that attackers implant on web servers to provide remote access and code execution to server functions. Web shells allow attackers to run commands on servers to steal data or use the server as launch pad for other activities like credential theft, lateral movement, deployment of additional payloads, or hands-on-keyboard activity, while allowing attackers to persist in an affected organization.
As web shells are increasingly more common in attacks, both commodity and targeted, we continue to monitor and investigate this trend to ensure customers are protected. In this blog, we will discuss challenges in detecting web shells, and the Microsoft technologies and investigation tools available today that organizations can use to defend against these threats. We will also share guidance for hardening networks against web shell attacks.
Web shells as entry point for attacks
Attackers install web shells on servers by taking advantage of security gaps, typically vulnerabilities in web applications, in internet-facing servers. These attackers scan the internet, often using public scanning interfaces like shodan.io, to locate servers to target. They may use previously fixed vulnerabilities that unfortunately remain unpatched in many servers, but they are also known to quickly take advantage of newly disclosed vulnerabilities.
For example, on June 30, F5 Networks released a patch for CVE-2020-5902, a remote code execution (RCE) vulnerability in Traffic Management User Interface (TMUI). The vulnerability is a directory traversal bug with a CVSS score of 9.8 out of a possible 10. Just four days later, on July 4, exploit code was added to a Metasploit module.
Figure 2. CVE-2020-5902 exploit code
The following day, Microsoft researchers started seeing the exploit being used by attackers to upload a web shell to vulnerable servers. The web shell was used to run common cryptocurrency miners. In the days that followed, industry security researchers saw the exploit being broadly used to deploy web shells, with multiple variants surfacing not long after.
This incident demonstrates the importance of keeping servers up to date and hardened against web shell attacks. Web servers are frequently accessible from the internet and can be used by attackers to gain access to a network.
Web shells as persistence mechanisms
Once installed on a server, web shells serve as one of the most effective means of persistence in an enterprise. We frequently see cases where web shells are used solely as a persistence mechanism. Web shells guarantee that a backdoor exists in a compromised network, because an attacker leaves a malicious implant after establishing an initial foothold on a server. If left undetected, web shells provide a way for attackers to continue to gather data from and monetize the networks that they have access to.
Compromise recovery cannot be successful and enduring without locating and removing attacker persistence mechanisms. And while rebuilding a single compromised system is a great solution, restoring existing assets is the only feasible option for many. So, finding and removing all backdoors is a critical aspect of compromise recovery.
And this brings us back to the challenge of web shell detection. As we mentioned earlier, web shells can be generalized as a means of executing arbitrary attacker input by way of an implant. The first challenge is dealing with just how many ways an attacker can execute code. Web applications support a great array of languages and frameworks and, thus, provide a high degree of flexibility and compatibility that attackers take advantage of.
In addition, the volume of network traffic plus the usual noise of constant internet attacks means that targeted traffic aimed at a web server can blend right in, making detection of web shells a lot harder and requiring advanced behavior-based detections that can identify and stop malicious activities that hide in plain sight.
Challenges in detecting web shells
Web shells can be built using any of several languages that are popular with web applications. Within each language, there are several means of executing arbitrary commands and there are multiple means for arbitrary attacker input. Attackers can also hide instructions in the user agent string or any of the parameters that get passed during a web server/client exchange.
Attackers combine all these options into just a couple of bytes to produce a web shell, for example:
Figure 3. Example of web shell code
In the example above, the only readable word in the web shell is “eval”, which can be easy to miss or misinterpret. When analyzing script, it is important to leverage contextual clues. For example, a scheduled task called “Update Google” that downloads and runs code from a suspicious website should be inspected more closely.
With web shells, analyzing context can be a challenge because the context is not clear until the shell is used. In the following code, the most useful clues are “system” and “cat /etc/passwd”, but they do not appear until the attacker interacts with the web shell:
Figure 4. Another example of web shell code
Another challenge in detecting web shells is uncovering intent. A harmless-seeming script can be malicious depending on intent. But when attackers can upload arbitrary input files in the web directory, then they can upload a full-featured web shell that allows arbitrary code execution—which some very simple web shells do.
These file-upload web shells are simple, lightweight, and easily overlooked because they cannot execute attacker commands on their own. Instead, they can only upload files, such as full-featured web shells, onto web servers. Because of their simplicity, they are difficult to detect and can be dismissed as benign, and so they are often used by attackers for persistence or for early stages of exploitation.
Finally, attackers are known to hide web shells in non-executable file formats, such as media files. Web servers configured to execute server-side code create additional challenges for detecting web shells, because on a web server, a media file is scanned for server-side execution instructions. Attackers can hide web shell scripts within a photo and upload it to a web server. When this file is loaded and analyzed on a workstation, the photo is harmless. But when a web browser asks a server for this file, malicious code executes server side.
These challenges in detecting web shells contribute to their increasing popularity as an attack tool. We constantly monitor how these evasive threats are utilized in cyberattacks, and we continue to improve protections. In the next section, we discuss how behavior-based detection technologies help us protect customers from web shell attacks.
How Microsoft helps defend networks against web shell attacks
Gaining visibility into internet-facing servers is key to detecting and addressing the threat of web shells. To tackle challenges in detecting these threats, Microsoft Defender for Endpoint uses a combination of durable protections that prevent web shell installation and behavior-based detections that identify related malicious activity. Microsoft Defender for Endpoint exposes malicious behavior by analyzing script file writes and process executions. Due to the nature of web shells, static analysis is not effective—as we have shown, it is relatively easy to modify web shells and bypass static protections. To effectively deliver protection, Microsoft Defender for Endpoint uses multiple layers of protection through behavior inspection.
Behavior-based blocking and containment capabilities, which use engines that specialize in detecting threats by analyzing behavior, monitor web-accessible directories for any new script file creation. While file creation events alone cannot be treated as suspicious, correlating such events with the responsible process tree can yield more reliable signals and surface malicious attempts. The engine can then remediate the script, neutralizing the primary infection vector. For example, IIS instance (w3wp.exe) running suspicious processes such as ‘cmd.exe /c echo’, ‘certutil.exe’, or ‘powershell.exe’ that result in the creation of script files in web -accessible folders is a rare event and is, thus, typically a strong sign of web server compromise and web shell installation.
Microsoft Defender for Endpoint also detects web shell installation attempts originating from remote systems within the organization using various lateral movement methods. For example, attackers have been observed to drop web shells through Windows Remote Management (WinRM) or use existing Windows commands to transfer web shells over SMB. On the web server, these remote actions are carried by system processes, thus giving visibility into the process tree. System privilege process dropping script files is another suspicious event and provides the behavior inspection engines ways to remediate the script before the attackers can perform any malicious actions.
Behavior-based protection also provides post-compromise defense in scenarios where attackers are already operating and running commands on web servers. Once attackers gain access to a server, one of their first steps is to understand the privilege and the environment they have access to by using built-in reconnaissance commands that are not typically used by web applications. IIS instance (w3wp.exe) running commands like ‘net’, ‘whoami’, ‘dir’, ‘cmd.exe’, or ‘query’, to name a few, is typically a strong early indicator of web shell activity.
IIS servers have built-in management tools used by administrators to perform various maintenance tasks. These platforms surface various PowerShell cmdlets that can expose critical information to the attackers. IIS instances (w3wp.exe) that host various web-facing client services such as Outlook on the web (formerly known as Outlook Web App or OWA) or Exchange admin center (EAC; formerly known as the Exchange Control Panel or ECP) accessing the management platform or executing below cmdlets is a suspicious activity and signifies a hands-on-keyboard attack. The behavior engine monitors execution of such cmdlets and the responsible process trees, for example:
With its behavior-based blocking and containment capabilities, Microsoft Defender for Endpoint can identify and stop behavior associated with web shell attacks. It raises alerts for these detections, enabling security operations teams to use the rich investigation tools in Microsoft Defender for Endpoint to perform additional investigation and hunting for related or similar threats.
Figure 5. Microsoft Defender for Endpoint alerts for behaviors related to web shell attacks
Microsoft 365 Defender and Microsoft Defender for Endpoint customers can also run advanced hunting queries to proactively hunt for web shell attacks:
Look for suspicious process that IIS worker process (w3wp.exe), Apache HTTP server processes (httpd.exe, visualsvnserver.exe), etc. do not typically initiate (e.g., cmd.exe and powershell.exe)
DeviceProcessEvents
| where InitiatingProcessCommandLine has_any("beasvc.exe","coldfusion.exe","httpd.exe","owstimer.exe","visualsvnserver.exe","w3wp.exe") or InitiatingProcessCommandLine contains 'tomcat'
| where FileName != "csc.exe" // exclude csharp compiler
| where FileName != "php-cgi.exe" //exclude php group, fast cgi
| where FileName != "vbc.exe" //exclude Visual Basic Command Line Compiler
| summarize by FileName
Look for suspicious web shell execution, this can identify processes that are associated with remote execution and reconnaissance activity (example: “arp”, “certutil”, “cmd”, “echo”, “ipconfig”, “gpresult”, “hostname”, “net”, “netstat”, “nltest”, “nslookup”, “ping”, “powershell”, “psexec”, “qwinsta”, “route”, “systeminfo”, “tasklist”, “wget”, “whoami”, “wmic”, etc.)
DeviceProcessEvents
| where InitiatingProcessParentFileName in~("beasvc.exe","coldfusion.exe","httpd.exe","owstimer.exe","visualsvnserver.exe","w3wp.exe") or InitiatingProcessParentFileName startswith "tomcat"
| where InitiatingProcessFileName in~("powershell.exe","powershell_ise.exe","cmd.exe")
| where FileName != 'conhost.exe'
Hardening servers against web shells
A single web shell allowing attackers to remotely run commands on a server can have far-reaching consequences. With script-based malware, however, everything eventually funnels to a few natural chokepoints, such as cmd.exe, powershell.exe, and cscript.exe. As with most attack vectors, prevention is critical.
Organizations can harden systems against web shell attacks by taking these preventive steps:
Identify and remediate vulnerabilities or misconfigurations in web applications and web servers. Use Threat and Vulnerability Management to discover and fix these weaknesses. Deploy the latest security updates as soon as they become available.
Implement proper segmentation of your perimeter network, such that a compromised web server does not lead to the compromise of the enterprise network.
Enable antivirus protection on web servers. Turn on cloud-delivered protection to get the latest defenses against new and emerging threats. Users should only be able to upload files in directories that can be scanned by antivirus and configured to not allow server-side scripting or execution.
Audit and review logs from web servers frequently. Be aware of all systems you expose directly to the internet.
Utilize the Windows Defender Firewall, intrusion prevention devices, and your network firewall to prevent command-and-control server communication among endpoints whenever possible, limiting lateral movement, as well as other attack activities.
Check your perimeter firewall and proxy to restrict unnecessary access to services, including access to services through non-standard ports.
Practice good credential hygiene. Limit the use of accounts with local or domain admin level privileges.
Thu Feb 11 2021 15:10:00 GMT+0700 (Western Indonesia Time)
The sample also admits authentication.
Apart from the parameters to connect to an InterBase server, the sample has four tabs to perform administrative tasks:
Server Users Tab:
Click Refresh Users to get all the users from the InterBase server.
Backup Tab:
Use this tab to backup a database. Introduce the Database Path to specify the InterBase database and the Backup Path to specify the backup destination file (*.ibk). You can also select several options to perform the backup.
Click Backup to start the backup.
Restore Tab:
Use this tab to restore a database from a backup. Introduce the Backup Path to specify the backup source file (*.ibk) and the Restore Path to specify the InterBase database. You can also select several options to restore the backup.
Click Restore to start the restoration.
Validate Tab:
Use this tab to validate the integrity of an InterBase database.
Click Validate to start the validation.
Location
You can find the AdminUtility project at:
Start | Programs | Embarcadero RAD Studio Sydney | Samples and then navigate to:
You can find Delphi code samples in GitHub Repositories. Search by name into the samples repositories according to your RAD Studio version.
How to Use the Sample
Navigate to the location given above and open IBAdminTool.dproj.
Press F9 or choose Run > Run.
Use the parameters by default to connect to the local InterBase server with the default SYSDBA user.
You can perform administrative tasks with the functionality of the four tabs.
Files
File
Contains
IBAdminTool.dproj
The project itself.
dmAdmin.pas/dfm
The data module containing the components and code for the admin tasks.
AdminUtility.pas/fmx
The main form and code calling the data module methods to perform admin tasks.
Implementation
The main functionality of the project is implemented on dmAdmin where the FireDAC components are placed. It uses TFDPhysIBDriverLink and TFDGUIxWaitCursor to connect to the InterBase server.
The sample uses a TFDMemTable from dmAdmin to display the table with the InterBase server users on the TStringGrid of the main form.
The TOpenDialog component is used to open a dialog to select the paths on the admin tasks filtering the InterBase Backups: *.ibk.
For more information and extra links to other information please refer to the below link:
Thu Feb 11 2021 09:53:01 GMT+0700 (Western Indonesia Time)
Thousands of Delphi and C++ Builder developers love Ehlib components. Because Ehlib contains productive components and classes which are very helpful to make great client part of the database applications with Delphi and C++ Builder.
The most complex component is TDBGridEh which offers all functionality of TDBGrid component and adds dozens of new features, for instance:
Automatic column resizing
Ability to change row and title height
Tooltips
Allows to export to CSV, HTML, XLS, and other internal formats
Sort/Filter data
Allows to draw on memo fields
and many more!
And we can also talk about TDBLookupComboboxEh. This is an enhanced version of the TDBLookupCombobox component and provides new functionalities.
Head over and find out more information about the Ehlib components in GetIt and then download it via the IDE.
Thu Feb 11 2021 03:13:07 GMT+0700 (Western Indonesia Time)
GBEPad is a simple, fast, complete and free text file editor for Windows and it is developed in Delphi. According to the developer “its lightness, efficiency and possibilities make it the ideal companion for developers but also for all users who regularly handle text files. It has many configuration options to best meet user expectations. GBEPad is a free text editor like NotePad++ with a lot of features (FTP client, multi cursor, Emmet support, large search options, open big files, compare two files…). At the beginning, (2004) GBEPad was build with Delphi 7, and now it is build under Delphi Sydney. GBEPad is a VCL application. You can also configure your tools (compilers, other tools…). By default, GBEPad comes with 35 syntax highlighters for the major programming languages. You can adapt these highlighters according to your needs but also create new ones. On the Extensions page you will find other highlighters that can be downloaded separately.”
Thu Feb 11 2021 03:06:26 GMT+0700 (Western Indonesia Time)
BioniX is a world famous wallpaper switcher/changer (according to the developer) that allows you to fully take control over your desktop and it is built in Delphi. The developer states, “It is the choice of millions of users all over the world and winner of multiple awards from renowned reviewers and critics.” According to the developer, “BioniX offers unique features that no other background switcher offers. For example, with “Lock on folder” you can monitor a folder and automatically update the playlist when wallpapers are added to that folder. Another cool feature is ‘Day/night’ which allows you to display a specific wallpaper on your desktop based on your local time (for example sunrise wallpapers in the morning and sunset wallpapers in the evening . You can choose which wallpaper appears at which hour of the day. Find a non-exhaustive list of amazing features here.”
Thu Feb 11 2021 02:58:42 GMT+0700 (Western Indonesia Time)
MDIDS-GT is the Multi-Disciplinary Integrated Design System for Gas Turbines and it is developed in Delphi. According to the developer, “this is the only free, and specialized engineering software, for the design and analysis of gas turbine engines. What makes MDIDS-GT so different from other available gas turbine software? Well, it combines, incorporates, and standardizes many unique disciplines into one functional and versatile environment. MDIDS-GT is much more effective, when compared to other software that offer different tools for different disciplines, because MDIDS-GT is a single software flexible enough to be used for many disciplines and the various gas turbine design activities related to these disciplines. It incorporates the use of the various 1D and 2D philosophies and methodologies, which have been developed and used by the gas turbine industry over the last seventy years, into one user-friendly, versatile, and functional application environment.”
Thu Feb 11 2021 02:50:22 GMT+0700 (Western Indonesia Time)
The TatukGIS Editor is a professional, general-purpose Windows GIS application for geospatial data creation, editing, mapping, and analysis and it is powered by Delphi. According to the developer, “This Editor provides the tools and functionality required by most GIS users, including multi-layer map projects, compatibility with most geospatial industry data formats and database engines, advanced rendering, 5,000+ coordinate systems with on-the-fly layer reprojection, 3D visualization, and GPS tracking. Advanced geospatial analyses and operations include data classification methods, layer statistics, contouring, slope analysis, viewshed and AGL visibility analysis, terrain profile, vector-to-grid interpolation algorithms, point cloud-to-grid conversion, operation pipelining, raster layer mathematics, advanced filters, topological operations, and geocoding. A powerful built-in (Pascal and Basic) scripting engine for creating plug-ins exposes a comprehensive API with hundreds of classes and thousands of documented methods and properties designed for custom GIS development. The TatukGIS Editor was released in 2005 and continuously updated/upgraded ever since. (The TatukGIS Editor is compiled from the TatukGIS Developer Kernel, a comprehensive GIS SDK also built in Delphi.)”
Thu Feb 11 2021 02:45:21 GMT+0700 (Western Indonesia Time)
Idle Western is a Wild West Style Idle Ranch Mobile Game and it is built in Delphi. According to the developer “This game is developed with Delphi 10.4.1- iOS SDK 14.3, still under development and open beta now. We are collecting user feedbacks and bugs. Reached 57.000 Unique users with many kind of Device Type and iOS version. I think this is important data for Delphi cross platform stability. For technical information: We didn’t use any game engine, this is a pure FMX 2D sprite based game. We used Blender for render sprites and TBitmapAnimation for run these sprites. OrangeUI components for UI items. JVESuite components for Admob monetize.” The game looks great!
Thu Feb 11 2021 02:31:43 GMT+0700 (Western Indonesia Time)
Falcon 9 – First Stage Simulator uses engineering equations to simulate the behavior, efforts and performance, in addition to controlling the trajectory, of the first stage of a Falcon 9 (SpaceX) rocket and it is built in Delphi. According to the developer “It has different panels for loading structural information, performance characteristics of engines, throttle control curves and vehicle inclination, etc. The main panel shows the progress of the simulation in real-time, and a 3D model in an OpenGL window, all this, initially synchronized with a real video of the launch that allows comparing speeds and altitudes at each moment to evaluate the accuracy of the simulation. Finally, once the simulation is completed, it is possible to download all the information in an Excel file to make evaluation graphs. All parameters of the application (structural, engine and control) are fully customizable, so you can configure and simulate every mission you want and compare the results in real-time with the real video. The application is still being developed, therefore, the experience includes the launching stage and it goes on up to the separation of the second stage. This application was written using Delphi Community 10.3.”
Thu Feb 11 2021 02:27:44 GMT+0700 (Western Indonesia Time)
Relyze Desktop lets you reverse engineer, decompile and diff x86, x64, ARM32 and ARM64 software, allowing you to understand and visualize how native code software operates. Developed with C++ Builder we leverage the Visual Component Library (VCL) to build a sleek modern interface with a flat UI design ethos in order to bring the analysis to center stage. Relyze Desktop Standard is freely available for non commercial use.
Thu Feb 11 2021 02:24:21 GMT+0700 (Western Indonesia Time)
AIMP is powerful audio player and organizer that additionally includes a few tools for audio (tag editor, audio converter) and it is powered by Delphi. Here are some features of the software according to the developer:
Internet radio
Listen internet-radio stations in OGG / WAV / MP3 / AAC / AAC+ formats
Capture stream to APE, FLAC, OGG, WAV, WV, WMA and MP3 formats
Capture stream as is for MP3 / AAC / AAC+ formats
Thu Feb 11 2021 02:21:01 GMT+0700 (Western Indonesia Time)
Do you need to collect system information which need to be encrypted and compressed to a file for later use in your Delphi application. MiTec’s System Information Management Suite helps to easily encrypt/decrypt the system information. In this blog post how to use the TMiTec_SystemInfo component’s TCodeStreamProcedure to Encrypt, Compress and save system information into a custom format file and load the same with the sample application.
Platforms: Windows.
Installation Steps:
You can easily install this Component Suite from GetIt Package Manager. The steps are as follows.
Navigate In RAD Studio IDE->Tools->GetIt Package Manager->select Components in Categories->Components->Trail -MiTec system Information Component Suite 14.3 and click Install Button.
Read the license and Click Agree All. An Information dialog saying ‘Requires a restart of RAD studio at the end of the process. Do you want to proceed? click yes and continue.
It will download the plugin and installs it. Once installed Click Restart now.
How to run the Demo app:
Navigate to the System Information Management Suite trails setup, Demos folder which is installed during Get It installation e.g) C:UsersDocumentsEmbarcaderoStudio21.0CatalogRepositoryMiTeC-14.3DemosDelphi2
Open the SCPDemo project in RAD studio 10.4.1 compile and Run the application.
This Demo App shows how to access the system information like Machine, Memory, CPU, Graphics, OS, etc.
Components used in MSIC StreamCodeProcedureDemo App:
TMiTeC_SystemInfo: This component encapsulates most of MSICS components into one interface. Key properties are shown below. Using those properties we can easily get the respective component properties. e.g consider CPU property has its own properties such as CPU architecture, Brand, CPU count, etc. Using this simple component you can access the entire system information quickly. Alternatively, we can access these components individually.
TButton to open and save the system information to a file.
TListView, to populate the collected system information in a list view.
Implementation Details:
An instance is created SI of TMiTeC_SystemInfo. Using SI properties Machine, Memory, CPU, Graphics, OS, the respective values were added to the List view.
procedure TwndMain.FillList;
var
c,i,idx: Integer;
begin
List.Items.BeginUpdate;
try
List.Items.Clear;
if SI.OS.DataAvailable and (SI.OS.OSName<>'') then begin
with List.Items.Add do begin
Caption:='Machine';
if SI.Machine.BIOS.BIOSDataCount>0 then
SubItems.Add(SI.Machine.BIOS.BIOSValue['SystemProductName'].Value)
else
SubItems.Add(SI.Machine.SMBIOS.SystemModel);
end;
with List.Items.Add do begin
Caption:='CPU';
SubItems.Add(Format('%d x %s - %d MHz',[SI.CPU.CPUPhysicalCount,SI.CPU.CPUName,SI.CPU.Frequency]));
end;
with List.Items.Add do begin
Caption:='Memory';
if SI.Machine.SMBIOS.MemoryDeviceCount>0 then begin
c:=0;
idx:=-1;
for i:=0 to SI.Machine.SMBIOS.MemoryDeviceCount-1 do
if SI.Machine.SMBIOS.MemoryDevice[i].Size>0 then begin
Inc(c);
if idx=-1 then
idx:=i;
end;
SubItems.Add(Format('%d x %d MB %s',[c,
SI.Machine.SMBIOS.MemoryDevice[idx].Size,
MemoryDeviceTypes[SI.Machine.SMBIOS.MemoryDevice[idx].Device]]))
end else
SubItems.Add(Format('%d MB',[SI.Memory.PhysicalTotal shr 20]));
end;
for i:=0 to SI.Display.AdapterCount-1 do
with List.Items.Add do begin
Caption:='Graphics';
if SI.Display.Adapter[i].Memory>0 then
SubItems.Add(Format('%s - %d MB',[SI.Display.Adapter[i].Name,SI.Display.Adapter[i].Memory shr 20]))
else
SubItems.Add(SI.Display.Adapter[i].Name);
end;
with List.Items.Add do begin
Caption:='OS';
SubItems.Add(Format('%s %s',[SI.OS.OSName,SI.OS.OSEdition]));
end;
end else
List.Items.Add.Caption:='No data available';
finally
List.Items.EndUpdate;
end;
end;
Save the System information into a custom file format .cff by choosing the option Encrypt/Compress/Encrypt And Compress. The Stream is encrypted/Decrypted/Compressed/Decompressed using the following TCodeStreamProcedure type procedures. SaveToStorage is used to save the system information into the file.
procedure EncryptStream(InStream, OutStream: TStream);
begin
CryptStream(InStream,OutStream,StringToBytes('password'),True,CALG_SHA1,CALG_RC4);
end;
procedure DecryptStream(InStream, OutStream: TStream);
begin
CryptStream(InStream,OutStream,StringToBytes('password'),False,CALG_SHA1,CALG_RC4);
end;
procedure CompressStream(InStream, OutStream: TStream);
{$IF (CompilerVersion >= 21.0) or Defined(FPC)}
begin
InStream.Position:=0;
ZCompressStream(InStream, OutStream, zcMax);
{$ELSE}
var
InpBuf, OutBuf: Pointer;
InpBytes, OutBytes: Integer;
begin
InpBuf:=nil;
OutBuf:=nil;
try
GetMem(InpBuf,InStream.Size);
InStream.Position:=0;
InpBytes:=InStream.Read(InpBuf^,InStream.Size);
CompressBuf(InpBuf, InpBytes,OutBuf,OutBytes);
OutStream.Write(OutBuf^,OutBytes);
finally
if InpBuf<>nil then
FreeMem(InpBuf);
if OutBuf<>nil then
FreeMem(OutBuf);
end;
{$IFEND}
OutStream.Position:=0;
end;
procedure DecompressStream(InStream, OutStream: TStream);
{$IF (CompilerVersion >= 21.0) or Defined(FPC)}
begin
InStream.Position:=0;
ZDecompressStream(InStream, OutStream);
OutStream.Position:=0;
{$ELSE}
var
InpBuf, OutBuf: Pointer;
OutBytes, Size: Integer;
begin
InStream.Position:=0;
InpBuf:=nil;
OutBuf:=nil;
Size:=InStream.Size-InStream.Position;
if Size>0 then
try
GetMem(InpBuf,Size);
InStream.Read(InpBuf^,Size);
DecompressBuf(InpBuf,Size,0,OutBuf, OutBytes);
OutStream.Write(OutBuf^,OutBytes);
finally
if InpBuf<>nil then
FreeMem(InpBuf);
if OutBuf<>nil then
FreeMem(OutBuf);
end;
OutStream.Position:=0;
{$IFEND}
end;
Later it can be loaded from the file using LoadFromStorage procedureand populated using the load button. TMiTeC_SystemInfo also has events to Read/Write header to the custom file.
StreamCodeProcedure demo
Developers not required to spend many hours identifying low-level system APIs to collect system information and save securely to custom file format. Use this MiTeC component suite and get the job done quickly.
Thu Feb 11 2021 02:20:15 GMT+0700 (Western Indonesia Time)
Open source 3D Mahjong game is built in Delphi. According to the developer “Single person ‘Mahjong 3D’ support translations, create own ankles schemas as well as own ankles pictures and that everything only by simple text or graphic editors. The point of the game ‘Kryształowe kule’ (Crystal balls) is to catch falling balls to the basket. It is very easy relaxing game, the balls can give bonuses or debuffs like e.g. to change the size of the basket or the speed of the balls. Players are able to disable the bonuses and debuffs or only debuffs.”
According to the developer another game is in production. He relates “The game ‘Statki’ (Ships) is in production unfortunately but reached the main functionality. The game is a multilayer battleships shooter which allows to change and to create maps and ships models in text editors.”
Thu Feb 11 2021 02:13:17 GMT+0700 (Western Indonesia Time)
Owners and landlords access SGC Online to obtain information about their respective condominiums and it is powered by Delphi. According to the developer “The Online Condominium Management System, is a tool that brings the owner closer to his administrator and his Receiver. Online services make life easier for everyone, with greater quality, convenience, speed and transparency in accountability. The use of these facilities is available to any condominium that has access to the Internet, whether at home, at work, in public Internet rooms, or even while traveling, and in some services a printer is required (such as for broadcasting). 2nd invoice copy). Access all the Condominium Information through this application”:
Wed Feb 10 2021 23:00:00 GMT+0700 (Western Indonesia Time)
Building Python GUIs is easy with Embarcadero’s RAD Studio. You can use either Delphi or C++Builder to build the GUI side of the app. It is easy to integrate Python into the native Windows GUI apps that are produced by RAD Studio and they look great. RAD Studio (Delphi and C++Builder) provides may powerful features like REST clients, servers, web servers and more. However, if you have an existing Python app or you want to add Python to your existing Delphi app to access Python libraries or provide scripting for users this is a great place to start.
In this post we will talk about a number of posts on PythonGUI.org that will teach you how to build powerful Windows GUI apps integrated with Python. These posts cover Python REST servers, a Python web server, map, filter, and reduce functions, python decorators, partial functions, code introspection, and closures. Take a look!
Wed Feb 10 2021 22:22:03 GMT+0700 (Western Indonesia Time)
The RAD Studio IDE has a package manager called GetIt built in which that allows you to browse, download, purchase, and install packages. Packages provide libraries, components, IDE extensions, SDKs, styles, samples, and more. Packages available in the package manager can be browsed on the Embarcadero GetIt site and installed in the IDE or via a command line. Additionally, the latest list of new packages added into the GetIt Package Manager is available via RSS feed.
GetIt can help customers discover valuable libraries and easily install them in the IDE plus it is meant to help simplify the migration from one version of RAD Studio to the next, making sure those libraries are available upon release so that an existing project can be easily migrated after a rapid download of the required libraries.
You can install packages from GetIt via the command line: GetItCmd
GetIt Package Manager - Version 7.0
Copyright c 2019 Embarcadero Technologies, Inc. All Rights Reserved.
Usage: GetItCmd []:
-install or -i
Install Item[s] separated with ';'
-uninstall or -u
Uninstall Item[s] separated with ';'
-user_name:
User name for proxies with required authentication.
-password:
Password for proxies with required authentication.
-accept_eulas
The user accepts EULA[s] of downloaded package[s].
-verb:[Quiet/Minimal/Normal/Detailed]
Specifies the verbose level for console output messages.
-listavailable:[Filter by substring]
List all avilable packages from package source.
Options:
-filter:[All/Free/Acquired/Installed]. Default[Installed].
-sort:[Name/Vendor]. Default[Name].
-r Custom registry subkey for saving.
A number of new or updated libraries were added to Embarcadero GetIt in December 2020. Take a look!
nrComm Lib provides tools for performing the serial communications tasks and device access. It has ready solutions for: serial rs232 lpt ports, usb, bluetooth, hid, modbus, gsm, sms and others.29 Jan 2021 Trial
Sempare Template Engine for Delphi allows for flexible text manipulation. It can be used for generating email, html, source code, xml, configuration, etc.28 Jan 2021 GPL v3.0 or Sempare Commercial
TMS VCL WebGMaps is a component set with extensive configurability for integrating Google Maps in Delphi and C++Builder. Different map modes are available and extra map information can be displayed.20 Jan 2021 Commercial
Create modern-looking & feature-rich Windows applications faster with well over 600 components in one money and time saving bundle for Delphi & C++Builder20 Jan 2021 Commercial
TMS VCL Cloud Pack is a Delphi and C++Builder component library to seamlessly use all major cloud services such as Facebook, Twitter, OneDrive, Google Drive, iCloud, Amazon cloud drive, LinkedIn, Paypal, Trello, Youtube and many more …20 Jan 2021 Commercial
Add the ultimate flexibility and power into your apps with native Pascal or Basic scripting and full IDE with visual form designer, object inspector, and more.20 Jan 2021 Commercial
Set of components for true native iOS application development. No compromises: 100% iOS performance, 100% iOS look, 100% iOS feel components.18 Jan 2021 Commercial
Use one UI control set to master application development in VCL, FMX and LCL. Includes grid, planner, treeview, richeditor, toolbar,…18 Jan 2021 Commercial
Fully cross-platform chart component for VCL, FMX and LCL development designed for business, statistical, financial and scientific data.18 Jan 2021 Commercial
Single-source fully cross platform component set for desktop and mobile application development for Windows, Mac OS-X, iOS and Android18 Jan 2021 Commercial
TMS FMX Cloud Pack is a Delphi and C++Builder component library to seamlessly use all major cloud services such as Facebook, Twitter, OneDrive, Google Drive, Amazon cloud drive, LinkedIn, Paypal, Trello, Youtube and many more …18 Jan 2021 Commercial
Communications package that provides access to the serial ports under Windows. The event-driven architecture provides the highest possible performance and allows all the tools to run in the background.18 Jan 2021 Commercial
Source code profiler for measuring runtime of 64 and 32 bit applications developed with Delphi. Bottlenecks are easily found with the help of a comfortable viewer.12 Jan 2021 Freeware
Wed Feb 10 2021 22:18:35 GMT+0700 (Western Indonesia Time)
EraDB today took the covers off EraSearch, a distributed log management tool built atop the startup’s S3-based database service. The company claims the Kubernetes-based EraSearch offering is API-compatible with Elasticsearch, but is more scalable and easier to manage than the popular open source log management tool it seeks to replace.
EraDB CEO Todd Persen and his co-founder, CTO Robert Winslow, didn’t target Elasticsearch with its new product because it thinks Elasticsearch is a bad product. In fact, Persen recognizes that Elasticsearch is a very useful tool that has enabled lots of people to get value out of their log data.
But according to Persen, limitations in Elasticsearch’s capability to scale to handle today’s massive data volumes are not going to be addressed any time soon with the Java-based product, which is now 12 years old. That has put the writing on the wall for some Elasticsearch customers that it’s time to move on, he says.
“It’s very expensive from an infrastructure perspective, and it’s also very complicated,” says Persen, who previously was the CTO and co-founder of time-series database provider InfluxData before starting EraDB, which also is a time-series database. “You need ops teams who are constantly taking care of the systems, managing node health, managing disks, and how data is distributed around the cluster.”
When you factor in Elastic’s recent decision to change its license, you find more people starting to look for alternatives, Persen says.
“There’s a lot of folks who chose it because it’s open source, but now no longer feel like they’re supporting a true open source product,” he says. “They say, I’ve banked all my energy on this thing, but it seems like it’s changing out from under me. Should I go with something else. Is this time to switch?”
EraDB is hoping to position its EraSearch offering as something they can switch to without a lot of pain. Because the Elasticsearch query API was so well documented, Persen and his team were able to write their own software that adheres very closely to that API. Person says customers can basically drop EraSearch in, and users won’t even know the difference.
EraSearch replicates the ElasticSearch query API for all log queries, right down to having the same input and output and the same query syntax. It supports all of the same tools that Elasticsearch uses to input log data, including Logstash, Telegraf, Vector, and Kafka, and supports some of the same tools for visualizing output, such as Kibana, Grafana, and Drill.
EraDB has not tried to replicate all of the other things that Elasticsearch does, such as for document search, machine learning, etc. It is focused only on log management and related observability use cases, including security. But for that log management component, it is convinced that it has a better cog for user’s big data machines.
“We’ve essentially replicated the lifecycle of a query through Elasticsearch inside of Era Search,” Persen says. “We wrote our own query parser to do the exact same things that Elasticsearch does. We’ve just written it in a new, more performant language using some of the architectural design principals that are part of EraDB.”
EraSearch was written in Rust, which provides extensive performance benefits over Java and its memory-sapping garbage collection routines. It runs as a container inside Kubernetes, which enable it to scale more easily than previous generation products, like Elasticsearch and Apache Cassandra, Persen says. EraSearch leverages the data caching and indexing technologies in EraDB, the company’s database layer that runs atop an S3-compatbile object store, which provides the nearly limitless storage.
Todd Persen is the CEO and co-founder of EraDB
In short, EraSearch was built atop a modern, cloud-native architecture, which Persen does not expect Elastic to do anytime soon with the hugely popular Elasticsearch product. When you put all these elements together, an EraSearch cluster running on the same infrastructure as an Elasticsearch cluster will enjoy 2-3x performance advantage, Persen says. Users get that benefit, without giving up anything in the usability department, he says.
“You have the same ergonomics. You can use the same tools to write data in and the same tools to write data out,” Persen says. “Essentially we can give you query parity and all you have to do is deploy EraSearch alongside Elasticsearch installation. You can evaluate them side by side using the exact same tools. Once you’ve deployed EraSearch and you’re ingesting data into it, everything works just like it would with Elasticsearch, so the switching cost is very low.”
Because EraSearch is focused solely on log management, it is not going to replace the non-log management things that Elasticsearch does, such as relevancy ranking. Persen is a fan of relevancy ranking when it comes to Internet search engines, but not for log management.
“We’ve been able to focus our energy, focus our problem solving and remove some of those things that, while they might be useful in other domains, are not an additive features,” he says. “They’re acutely a hindrance because we have to do all this extra work and do all this extra processing that slows things down.”
The company favors strong consistency, which means all log data is written to S3 before an acknowledgement is sent to the user. There will be no lost data in the EraSearch pipeline, which is not the case with systems that use eventual consistency, including InfluxDB and Elasticsearch, Persen says.
“A lot of it is making sure we’ve designed a system that can keep up with that write load and also that’s saleable, whether it’s one node doing ingest or 10 nodes, that those can actually scale independently of each other without creating a conflict,” he says. “In a lot of systems, you’ll see, as you start to scale, there’s this bottleneck that starts to come….So a lot of it is making some of these really important architectural decisions up front so that we have a system that’s capable of maintaining that correctness’s from an indexing and caching perspective, but also still being able to manage that durability so we can have those guarantees for end users.”
The company is still getting its feet underneath it, but it is eyeing roadmap additions, such as support for machine learning, which will resonate with users. “AIops is a category that will be interesting to us,” Persen says. There aren’t ML algorithms searching for interesting correlations in the log data yet. “But it’s something we’re actively doing R&D on. It’s definitely in the roadmap for this year.”
EraSearch runs on the cloud and any S3-compatible object store. To find out more about EraSearch, check out the company’s website at www.eradb.com.
Wed Feb 10 2021 18:10:29 GMT+0700 (Western Indonesia Time)
The roster of data monitoring platform vendors continues to grow with the release of open source SQL management tools by Belgian startup Soda.
Earlier this month, Brussels-based Soda announced a $17.7 million Series A and seed funding round led by European venture investor Singular along with existing seed funders DCF, Hummingbird Ventures, Point Nine Capital and angel investors.
The two-year-old startup said the funding round marks the first stage of an initiative to release open source management tools that would help identify and monitor large data sets, data lakes and data warehouses. The suite includes tools for screening data pipelines while monitoring data via configurable tests.
Soda said Tuesday (Feb. 9) it is developing an open source data testing and monitoring suite dubbed Soda SQL that includes developer tools for data frames and streaming data. Those tools are promoted as operating across data workloads and query engines.
Environments covered include Kafka, Spark, Amazon Web Services S3 and RedShift, Microsoft Azure Blob Storage and Azure Synapse, Google Cloud Datastore and BigQuery, Presto and Snowflake.
Soda SQL configuration options are designed to allow data engineers to monitor tests used to screen for bad data. Metrics are also included to evaluate results.
The data management platform uses SQL requests to extract column profiles and metrics. Query control is provided through declarative YAML configuration files. Soda SQL tests are run across data pipelines, triggering alerts when bad data is detected.
“The subject of testing is not code, but the data,” said Maarten Masschelein, Soda’s CEO and co-founder. The goal is detecting data quality issues early, while boosting collaboration to maintain quality via an open source management tool.
“Businesses are moving from using data to being built entirely on data, but there are challenges in terms of how they collect, process and maintain this data,” Masschelein added.
“You need to test and monitor data to stay on top of it, but most companies don’t have the capabilities and engineering resources to do this.”
Soda SQL runs either in the cloud or on-premise, and is available free on GitHub.
Wed Feb 10 2021 13:44:00 GMT+0700 (Western Indonesia Time)
uniGUI Web Application Framework is a full-stack web application development tool for Embarcadero Delphi. uniGUI is empowered by Sencha Ext JS advanced cross-browser JavaScript library. uniGUI allows developers to develop visually compelling web applications directly in Delphi IDE.
Wed Feb 10 2021 11:23:00 GMT+0700 (Western Indonesia Time)
We have seen how to enumerate among the running processes and services in this blog post. How about monitor a particular process in your machine ? How to identify the list of threads, modules, handles associated to a particular process programmatically? Don’t know how to do. Don’t worry. MiTec’s System Information Management Suite’s component helps to do that effectively and we will learn how to use the thread TSysProcMonThread to demonstrate the process monitoring.
Platforms: Windows.
Installation Steps:
You can easily install this Component Suite from GetIt Package Manager. The steps are as follows.
Navigate In RAD Studio IDE->Tools->GetIt Package Manager->select Components in Categories->Components->Trail -MiTec system Information Component Suite 14.3 and click Install Button.
Read the license and Click Agree All. An Information dialog saying ‘Requires a restart of RAD studio at the end of the process. Do you want to proceed? click yes and continue.
It will download the plugin and installs it. Once installed Click Restart now.
How to run the Demo app:
Navigate to the System Information Management Suite trails setup, Demos folder which is installed during Get It installation e.g) C:UsersDocumentsEmbarcaderoStudio21.0CatalogRepositoryMiTeC-14.3DemosDelphi18
Open the PM project in RAD studio 10.4.1 compile and Run the application.
This Demo App shows how to list down the running processes and its threads, handles, modules association for the selected process.
Components used in MSIC PM Demo App:
TSysProcMonThread: Monitors system and provides running processes, CPU, memory and disk monitoring and provides system information.
TListView for viewing running Process list.
TPanel to show the Threads, Modules, Handles list information in a separate tab sheets for the selected process.
Implementation Details:
An instance FSPM of TSysProcMonThread were created. And in regular interval of the thread, Process list refreshed and updated to the screen using the OnInterval Event handler. On each interval, the Process List is refreshed using RefreshProcList.
On each interval, ThreadList, Modules List, Handles List is refreshed using procedures RefreshThreadList, RefreshModList, RefreshHandleList if a particular process is monitored.
procedure TwndMain.SYsProcMonThreadInterval(Sender: TSysProcMonThread);
var
p: TProcessRecord;
s: string;
dt: TDatetime;
vi: TVersionInfo;
begin
RefreshProcList;
Sender.GetRecordByPID(Sender.MaxCPUUsageProcessID,p);
sb.Panels[1].Text:=Format('Max CPU usage: %s (%d)',[p.Name,p.PID]);
if FSPM.IsProcessWatched(FRecord.PID) then begin
FSPM.GetRecordByPID(FRecord.PID,FRecord);
if lSigner.Tag=0 then begin
if VerifyFile(FRecord.ImageName,s,dt)=0 then begin
lSigner.Caption:='(Verified) '+s;
lSigner.Font.Color:=clBlue;
lSigner.Font.Style:=[fsUnderline];
lSigner.Cursor:=crHandPoint;
end else begin
GetFileVerInfo(FRecord.ImageName,vi);
lSigner.Caption:='(UNVERIFIED) '+vi.CompanyName;
lSigner.Font.Color:=clWindowText;
lSigner.Font.Style:=[];
lSigner.Cursor:=crDefault;
end;
lSigner.Tag:=1;
end;
CPUGauge.Position:=FRecord.Performance.CPUUsage.RoundValue;
lCPU.Caption:=Format('CPU Usage: %1.2f %%',[FRecord.Performance.CPUUsage.Value]);
lTitle.Caption:=Format('[%d] %s (%d-bit)',[FRecord.PID,FRecord.ImageName,FRecord.Platform]);
lCT.Caption:=Format('Created: %s',[DateTimeToStr(FRecord.CreationTime)]);
lPri.Caption:=Format('Priority: %d',[FRecord.Priority]);
lMem.Caption:=Format('Memory: %s',[NormalizeDataValue(FRecord.VMCounters.WorkingSetSize/1)]);
lIORead.Caption:=Format('IO Read Rate: %s/s (Total: %s)',[NormalizeDataValue(FRecord.Performance.IOReadUsage.Delta),NormalizeDataValue(FRecord.Performance.IOReadUsage.Value)]);
lIOWrite.Caption:=Format('IO Write Rate: %s/s (Total: %s)',[NormalizeDataValue(FRecord.Performance.IOWriteUsage.Delta),NormalizeDataValue(FRecord.Performance.IOWriteUsage.Value)]);
tsHandles.Caption:=Format('Handles (%d/%d)',[FRecord.HandleList.Count, FRecord.HandleCount]);
tsModules.Caption:=Format('Modules (%d)',[FRecord.ModuleList.Count]);
RefreshThreadList;
if tsModules.TabVisible and ((pc.ActivePage=tsModules) or (ModList.Items.Count=0)) then
RefreshModList;
if (pc.ActivePage=tsHandles) or (HandleList.Items.Count=0) then
RefreshHandleList;
end;
end;
MiTeC Process Monitor Demo
By this way you can monitor any process in your application effectively. Use this MiTeC component suite and get the job done quickly.
このライブラリは、別のプラットホームで既に提供されているZXing.NETやZXing for Javaをベースにしています。もともとFireMonkeyプラットフォームを対象にしておりましたが、v3.1からは、Windows VCLアプリケーションも完全にサポートしています。(FMX.Graphicsユニットに非依存)
procedure TmainFrm.btnLoadFromFileClick(Sender: TObject);
var ReadResult: TReadResult;
ScanManager: TScanManager;
bmp:VCL.Graphics.TBitmap; // just to be sure we are really using VCL bitmaps
begin
if not OpenDlg.Execute then exit;
image.Picture.LoadFromFile(openDlg.FileName);
ReadResult := nil;
ScanManager := nil;
bmp := nil;
try
bmp:= TBitmap.Create;
bmp.assign (image.Picture.Graphic);
ScanManager := TScanManager.Create(TBarcodeFormat.Auto, nil);
ReadResult := ScanManager.Scan(bmp);
if ReadResultnil then
log.Lines.Text := ReadResult.text
else
log.Lines.Text := 'Unreadable!';
finally
bmp.Free;
ScanManager.Free;
ReadResult.Free;
end;
end;
Wed Feb 10 2021 04:40:24 GMT+0700 (Western Indonesia Time)
devFlowcharter is a small, freeware application written in Delphi. Its main goal is to be a straightforward, educational tool for use during structural programming classes.
In devFlowcharter, you create flowcharts using a user-friendly but powerful drawing engine, generate source code, compile with an external compiler and finally execute.
At the moment Pascal, C, TI-BASIC, Java, and Python are supported. The language support in devFlowcharter is an XML template, so you can easily add support for other languages, or even create your own.
Tue Feb 09 2021 23:44:19 GMT+0700 (Western Indonesia Time)
CaseTalk Modeler is the centerpiece of to the developers product line and it is built in Delphi. Modeler enables you to precisely capture the knowledge of the domain expert by using a method known as fact-oriented modeling. This is a conceptual method free of any technological bias, capturing knowledge in natural language format.
While no technical bias exists in the method, the Modeler is capable of generating technological artifacts that enable users to verbally validate using natural language every step of the way. This unites the I (Information) and T (Technology). The parties involved on the business side can now both specify and validate the information model, without having to sacrifice using their own language.
CaseTalk is built upon the elegant and substantial theory known as Fully Communication Oriented Information Modeling (FCO-IM). FCO-IM is the most prominent successor of the well-known method NIAM. Originally, NIAM presented a novel way of database modeling but eventually evolved as a verbal method of generic information modeling. For more information you can read more in the collection of various articles on the developer’s website.
Tue Feb 09 2021 23:39:45 GMT+0700 (Western Indonesia Time)
Infocob is a full CRM software with 25 years of development and experience and it is powered by Delphi. Features include: – Multi-users – Customers/Company/Contact handling – Customizable 360°, responsive design view (based on HTML with html editor) – Business – Multi-language (French/English/Spanish) – Ticket/support – Fully customizable dash-board – e-mail synchronization – E-mailing editor and generator – Project – Contract – Technician plugins and Offline mode – Report (Fast report with all options activated) – Calendar (Multi-resources, timeline, Agenda etc.) – Full customizable (Dictionary, field in grid, Layout field in forms etc..) – Integrate script language : Visual, triggers etc. (Delphi object Script) – Infinite number of user fields in more than 40 type (Barcode, Memo, RTF, time, mini-html, etc.) – Full replication (Two way at field level) – Offline working – Theme/Skin support – Manual or automatic (console app) Import/export (CSV, ADO, XLS etc.). Scriptable – Touchpad mode – Drivable externally via protocol, Windows message, command line etc. – Google / Office 365 / Exchange contact and calendar sync – CData plugins
Tue Feb 09 2021 23:31:44 GMT+0700 (Western Indonesia Time)
fotoARRAY is a specialized database program that allows you to browse and organize large numbers of images and is similar to a Digital Asset Management System (DAM) and it is made in Delphi.
fotoARRAY will let you access, view, organize and export images quickly and easily. Browsing through your photo archive with fotoARRAY is a pleasure. If you haven’t deleted extra or unwanted shots from your photo archive, fotoARRAY can transport you back to the very moment you took the pictures. Choose the photos you want to display – either by putting them in an album, assigning a specific key word or rating (1-10 stars) – and keep all the photos you took.
You can use fotoARRAY to organize images using albums, a time line, key words, stars and color labels. fotoARRAY allows you to concentrate on your photos, not on operating the program. Once you have created the album containing the pictures you want to publish, export the pictures to your desired location. To edit your images you can seamlessly start your favorite editor from within the program. Or you export a selection the images using the powerful image copy tool. Our goal is to integrate specialized RAW developing applications the best possible way and to provide the best browsing experience by offering lighting fast scrolling.
Tue Feb 09 2021 23:28:39 GMT+0700 (Western Indonesia Time)
SiteAnalyzer is a Web Crawler tool meant to scan URLs and perform a fast SEO analysis of a website and it is powered by Delphi. Use it to fix technical issues and improve SEO in the shortest period. According to their site the key features include: Find Broken Links, Check Redirects, Page Title and Meta Tag Analysis, H1-H6 Headings Checker, Link Analysis, Complete SEO Audit, PageRank Calculator, Every Project in One Place, Generate Sitemap.xml, Crawl Huge Websites Efficiently, Flexible Data Filtering, Scan Arbitrary URLs, Export Data, Performance and Reliability, Multi-language Support, Portable Application. SiteAnalyzer is a good example of a native Windows application built with Delphi.
Tue Feb 09 2021 22:29:43 GMT+0700 (Western Indonesia Time)
The beta release of high-flying Starburst’s first managed analytics service targets the enterprise migration to multi-cloud deployments that bring with them new data access challenges.
Starburst, a backer of the open source Presto query engine, is following last month’s close of a $100 million funding round with the release of its cloud-native Galaxy distributed analytics platform. Galaxy is built around the Trino SQL query engine, formerly known as Presto SQL. The federated SQL query engine was developed as a follow up to Apache Hive by Facebook engineers who went on to found Starburst.
The managed service “will help Starburst expand into a broader market to serve organizations without the internal resources, technical skills or bandwidth to quickly and easily take control of their data analytics,” the analytics vendor said Tuesday (Feb. 9).
Boston-based Starburst said it is targeting Galaxy at data analytic users requiring quick access to data scattered across multiple clouds. Hence, the managed service is promoted as reducing infrastructure oversight that includes easier cluster management along with tools used to finetune queries.
Meanwhile, data movement between cloud databases is reduced, thereby speeding analysis, by paring down requirements for shifting and copying data stored across multi-cloud and on-premise deployments.
Starburst’s multi-cloud strategy reflects the inexorable enterprise shift of databases and analytics tools to the cloud. The federated query engine on which Galaxy is based allows users to analyze data stored across databases, data lakes, distributed file systems and streaming data platforms.
Starburst goal is “helping companies move from the expensive ‘single source of truth’ ideology made famous by decades-old data warehouses, to a ‘single point of access’, which enables organizations to access all data across multiple cloud providers and even on premises without having to understand and manage the complicated underlying infrastructure,” said Matt Fuller, a co-founder and Starburst’s vice president of product.
The release of Galaxy follows the closing of a Series B round in January that pushed Starburst’s venture funding total to $164 million. The three-year-old company claims a market valuation of $1.2 billion, perhaps making the analytics startup another candidate for a future stock offering.
Tue Feb 09 2021 22:12:18 GMT+0700 (Western Indonesia Time)
Every organization wants to leverage their data as their strategic asset, scale data usage while effectively delivering speed, self-service, and ensuring security. To meet the growing demand for analytics in large enterprises, an automated approach to data privacy and governance is critical.
This poses a great opportunity for data professionals to develop an innovative enterprise-wide data strategy approach to disrupt existing labor-intensive, and complex legacy processes by ensuring automated Data Access Governance (DAG) without sacrificing core architecture guiding principles.
For years, enterprises have been bringing together data sources to expand data ammunition in the name of innovation. Along the way, things have gotten complicated with exponential data growth leading to environments where centralized governance and consistent security can be challenging and lead to slow data-sharing processes that create opportunities for data leaks. At the same time, while enterprises are still under pressure to “move fast,” regulations like the General Data Protection Regulation (GDPR) and California Consumer Privacy Act (CCPA) must be followed to protect the consumer and clients.
Key Business & IT Challenges
While data usage is expected to scale through the cloud-based data and analytical platforms, organizations must strategically drive the conversations, develop processes, and adopt technology capabilities to build trust, drive business value, and reduce data-related risks.
To drive an enterprise-scale solution, organizations should look to overcome these challenges as an initial step:
Privacy and design: The inability to achieve consensus on the definition, and priorities around data security/privacy as an organization including legal, privacy, infrastructure security, data access management, and engineering teams;
Discovery: Lack of end-to-end data mapping across the landscape including data relationships, critical patterns, and data movement across systems;
Data Catalog: The absence of a unified view of all data sets across on-premises, cloud applications and other data stores which inhibits data collaboration across teams;
Security: Challenges around implementation of robust security controls due to lack of data tagging, classification, and other foundational metadata items needed for sensitive data identification/protection;
Self-service: The inability to empower analytical teams by providing seamless access to both internal and external data without too many process burdens;
Fine-grain security: Challenges around implementation of data privacy, and compliance policies across regions, systems, and data lifecycle while ensuring consistent performance;
Audit: Data audits that do not paint a clear picture around who has access to data, when they’ve accessed and where; and
Operating Model: The perception of security teams as “roadblocks” standing in the way of easy-to-use tools for data privacy and security for non-IT users. No clear ownership, and processes for like access, sharing, rights, policies, quality, retention, etc.
But these challenges don’t have to be a breaking point anymore.
When organizations are faced with challenges around data privacy/security, a choice has to be made between what type of data platform they want to fuel their business, operational model around data, and approach to data governance.
Top-Down vs. Bottom-Up
A top-down approach to building data and analytics platforms, based on data governance best practices and policies, is often the choice. This approach can provide a cohesive and robust solution that complies well with privacy regulations, and where all the components interact well, adhering to strict security policies. Unfortunately, it can often become cumbersome for users and slow the time-to-value, with data consumers forced to adapt their data usage and consumption to the strict compliance and security-driven protocols driving the platform.
(whiteMocca/Shutterstock)
On the flip side, a bottom-up approach to data analytics is engineering and design-focused, with the goal of introducing incremental deliverables that add value to the platform in response to the user’s needs. The advantage is that value is realized early and often, because it allows architects to adopt the best of breed for each subject area. The downside is that integrating components incrementally might result in poor integration and technical difficulty securing the platform and complying with regulations.
Whether top-down or bottom-up, it’s critical for organizations to start with documenting privacy, security, data risks, controls, and technology needs around data access to address topics like culture of federated data ownership, adoption of self-service or collaboration across teams around critical data sets, and enterprise-wide technology standards for certain key areas. This quantitative approach helps with building enterprise data platforms that have privacy and security as a foundational layer that is risk and controls-based.
Aon’s Story: Self-Service Data Access & Automated Security
Data is a key strategic asset at the core of our business. It’s the secret sauce that helps us thrive and gain a competitive advantage, so the need to manage, maintain, and protect it is absolutely critical. There is no one solution out there that can address the complexity of our privacy and security needs, so data security and privacy must be baked into the design process, with automated controls.
At Aon, we have a large community of data consumers, engineers, and scientists spread across the globe, who glean insights for clients from millions of data sets while complying with restrictions related to compliance, privacy, and regional/industry regulations (e.g. Health Insurance Portability and Accountability Act [HIPAA], General Data Protection Regulation [GDPR], Personally identifiable information [PII], and the California Consumer Privacy Act [CCPA]).
We have navigated privacy, security, and compliance challenges by architecting a multi-region and multi-tenant cloud-based data and analytics services platform which offers:
Enterprise platform which is built based on public cloud with data lake as center piece, where existing data privacy/security controls can support multiple tenants, and clients across regions;
Democratized global data catalog with thousands of data sets with enriched metadata, tags, ownership, and classifications which support our data community to search, browse, and request access in an automated manner;
Empowerment of data owners who manage, and control access to their data without IT intervention using Immuta‘s automated governance product. This allows us to achieve automated data governance and advanced data privacy administration by applying global/local policies leveraging metadata tags, and data classification from data catalog;
True self-service of data for a community consisting of data scientists, data engineer, data analysts, and business user by providing access to easy-to-use data preparation tools along with isolated data landing zones for data storage;
Multiple capabilities around large-scale data processing mechanisms including traditional cluster computing programming, and public cloud native capabilities;
Cloud-based architecture and design which supports advanced digital product and application development using data, and analytics platforms as the backbone; and
Training ground for advanced analytics around machine learning, artificial intelligence leveraging agile tools, and auto-scale with containers with native security.
Our Approach
Our ultimate goal is to enable and empower our teams with tools allowing self-service access for data analysts, data scientists and line of business users so data can be safely used, shared, and distributed based on business need, and without any technical hurdles.
When data architects face a proliferation of rules that need to be implemented to process sensitive data, it can be difficult to enforce those rules in a scalable way. This is largely because they are driven by the security/compliance team in response to ever-changing rules around data use from data protection laws, data use agreements, employment laws, intellectual property controls, etc. The rules are not created from a user-centric perspective. As a result, data teams will often receive a list of requirements that, while effective in their ability to protect data and adhere to regulations, will also disrupt platform operations.
From a privacy and security standpoint, it’s a big commitment for those data teams. We need to architect and design our platforms based on global compliance needs and local laws, ensuring that it can scale to handle any future privacy/compliance needs while meeting all the necessary security controls, such as fine-grain access controls, global/regional data policies, data tagging, data masking, data classification and auditing. We have put into place robust processes, and reinforced deep alignment across data architecture, cloud engineering, network security, and platform security architecture teams, ensuring that we have reviewed data flows from end to end – from data discovery to data distribution.
All of this is designed to embed privacy into the DNA of our data security practices, but buy-in and participation from data consumers is also incredibly important. Right from the onboarding stage, data owners should go through extensive training and are held accountable for their actions – and security teams should take into account their concerns about usability.
In addition to data access governance, we need to match it with extensive processes, operational tasks, periodic reviews, automated alerts, and automated steps to identify discrepancies. Even with this level of meticulous planning, gaps will arise. That’s when we turn to partners like Immuta to scale user adoption with increased granularity and automation for fine-grained access and privacy controls, including centralized auditing and monitoring, dynamic policies based on both role and attribute-based access controls leveraging metadata from our enterprise data catalog, and to define entitlements and data access policies for heterogeneous data sources in our analytics infrastructure on public cloud.
To meet the goals of data-driven organizations, to disrupt your existing business model, or to promote innovation at scale, there needs to be embedding of data platforms, collaborative user communities, self-service technology capabilities, and robust data privacy/security processes. While there is no single solution currently available to manage data privacy, access, security, governance, compliance, and audit capabilities, these three pillars – privacy/security by design, technology partners, and strong internal processes – are essential to support consumers, and turn data into a differentiator.
About the author: Srinath Reddy is currently Head of Data at Aon, and part of Global CTO office. He has extensive expertise in building advanced analytical platforms leveraging public cloud.
Tue Feb 09 2021 18:16:29 GMT+0700 (Western Indonesia Time)
Join Embarcadero Delphi MVP Ian Barker for this must-watch session as he follows up his very popular previous webinar on how to give your apps the Fluent UI look and feel. This new webinar features heavily on the Delphi code, form design, and components you can use to really give your VCL and Fire Monkey apps the much sought-after Fluent UI look and behavior.
Tue Feb 09 2021 18:11:45 GMT+0700 (Western Indonesia Time)
TMS VCL Cloud pack is a set of VCL components that let you connect dozens of different cloud services within a few steps. With the TMS VCL Cloud pack you can integrate with Google, Microsoft, iCloud, DropBox, PayPal, YouTube, Facebook, LinkedIn, Yandex Disk, Amazon, Twilio, Flickr, and many more.
Tue Feb 09 2021 18:00:52 GMT+0700 (Western Indonesia Time)
Regression models are fit on training data using linear regression and local search optimization algorithms.
Models like linear regression and logistic regression are trained by least squares optimization, and this is the most efficient approach to finding coefficients that minimize error for these models.
Nevertheless, it is possible to use alternate optimization algorithms to fit a regression model to a training dataset. This can be a useful exercise to learn more about how regression functions and the central nature of optimization in applied machine learning. It may also be required for regression with data that does not meet the requirements of a least squares optimization procedure.
In this tutorial, you will discover how to manually optimize the coefficients of regression models.
After completing this tutorial, you will know:
How to develop the inference models for regression from scratch.
How to optimize the coefficients of a linear regression model for predicting numeric values.
How to optimize the coefficients of a logistic regression model using stochastic hill climbing.
Let’s get started.
How to Use Optimization Algorithms to Manually Fit Regression Models Photo by Christian Collins, some rights reserved.
Tutorial Overview
This tutorial is divided into three parts; they are:
Optimize Regression Models
Optimize a Linear Regression Model
Optimize a Logistic Regression Model
Optimize Regression Models
Regression models, like linear regression and logistic regression, are well-understood algorithms from the field of statistics.
Both algorithms are linear, meaning the output of the model is a weighted sum of the inputs. Linear regression is designed for “regression” problems that require a number to be predicted, and logistic regression is designed for “classification” problems that require a class label to be predicted.
These regression models involve the use of an optimization algorithm to find a set of coefficients for each input to the model that minimizes the prediction error. Because the models are linear and well understood, efficient optimization algorithms can be used.
In the case of linear regression, the coefficients can be found by least squares optimization, which can be solved using linear algebra. In the case of logistic regression, a local search optimization algorithm is commonly used.
It is possible to use any arbitrary optimization algorithm to train linear and logistic regression models.
That is, we can define a regression model and use a given optimization algorithm to find a set of coefficients for the model that result in a minimum of prediction error or a maximum of classification accuracy.
Using alternate optimization algorithms is expected to be less efficient on average than using the recommended optimization. Nevertheless, it may be more efficient in some specific cases, such as if the input data does not meet the expectations of the model like a Gaussian distribution and is uncorrelated with outer inputs.
It can also be an interesting exercise to demonstrate the central nature of optimization in training machine learning algorithms, and specifically regression models.
Next, let’s explore how to train a linear regression model using stochastic hill climbing.
Optimize a Linear Regression Model
The linear regression model might be the simplest predictive model that learns from data.
The model has one coefficient for each input and the predicted output is simply the weights of some inputs and coefficients.
In this section, we will optimize the coefficients of a linear regression model.
First, let’s define a synthetic regression problem that we can use as the focus of optimizing the model.
We can use the make_regression() function to define a regression problem with 1,000 rows and 10 input variables.
The example below creates the dataset and summarizes the shape of the data.
# define a regression dataset
from sklearn.datasets import make_regression
# define dataset
X, y = make_regression(n_samples=1000, n_features=10, n_informative=2, noise=0.2, random_state=1)
# summarize the shape of the dataset
print(X.shape, y.shape)
Running the example prints the shape of the created dataset, confirming our expectations.
(1000, 10) (1000,)
Next, we need to define a linear regression model.
Before we optimize the model coefficients, we must develop the model and our confidence in how it works.
Let’s start by developing a function that calculates the activation of the model for a given input row of data from the dataset.
This function will take the row of data and the coefficients for the model and calculate the weighted sum of the input with the addition of an extra y-intercept (also called the offset or bias) coefficient. The predict_row() function below implements this.
We are using simple Python lists and imperative programming style instead of NumPy arrays or list compressions intentionally to make the code more readable for Python beginners. Feel free to optimize it and post your code in the comments below.
# linear regression
def predict_row(row, coefficients):
# add the bias, the last coefficient
result = coefficients[-1]
# add the weighted input
for i in range(len(row)):
result += coefficients[i] * row[i]
return result
Next, we can call the predict_row() function for each row in a given dataset. The predict_dataset() function below implements this.
Again, we are intentionally using a simple imperative coding style for readability instead of list compressions.
# use model coefficients to generate predictions for a dataset of rows
def predict_dataset(X, coefficients):
yhats = list()
for row in X:
# make a prediction
yhat = predict_row(row, coefficients)
# store the prediction
yhats.append(yhat)
return yhats
Finally, we can use the model to make predictions on our synthetic dataset to confirm it is all working correctly.
We can generate a random set of model coefficients using the rand() function.
Recall that we need one coefficient for each input (ten inputs in this dataset) plus an extra weight for the y-intercept coefficient.
...
# define dataset
X, y = make_regression(n_samples=1000, n_features=10, n_informative=2, noise=0.2, random_state=1)
# determine the number of coefficients
n_coeff = X.shape[1] + 1
# generate random coefficients
coefficients = rand(n_coeff)
We can then use these coefficients with the dataset to make predictions.
...
# generate predictions for dataset
yhat = predict_dataset(X, coefficients)
We can evaluate the mean squared error of these predictions.
We can tie all of this together and demonstrate our linear regression model for regression predictive modeling. The complete example is listed below.
# linear regression model
from numpy.random import rand
from sklearn.datasets import make_regression
from sklearn.metrics import mean_squared_error
# linear regression
def predict_row(row, coefficients):
# add the bias, the last coefficient
result = coefficients[-1]
# add the weighted input
for i in range(len(row)):
result += coefficients[i] * row[i]
return result
# use model coefficients to generate predictions for a dataset of rows
def predict_dataset(X, coefficients):
yhats = list()
for row in X:
# make a prediction
yhat = predict_row(row, coefficients)
# store the prediction
yhats.append(yhat)
return yhats
# define dataset
X, y = make_regression(n_samples=1000, n_features=10, n_informative=2, noise=0.2, random_state=1)
# determine the number of coefficients
n_coeff = X.shape[1] + 1
# generate random coefficients
coefficients = rand(n_coeff)
# generate predictions for dataset
yhat = predict_dataset(X, coefficients)
# calculate model prediction error
score = mean_squared_error(y, yhat)
print('MSE: %f' % score)
Running the example generates a prediction for each example in the training dataset, then prints the mean squared error for the predictions.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
We would expect a large error given a set of random weights, and that is what we see in this case, with an error value of about 7,307 units.
MSE: 7307.756740
We can now optimize the coefficients of the dataset to achieve low error on this dataset.
First, we need to split the dataset into train and test sets. It is important to hold back some data not used in optimizing the model so that we can prepare a reasonable estimate of the performance of the model when used to make predictions on new data.
We will use 67 percent of the data for training and the remaining 33 percent as a test set for evaluating the performance of the model.
...
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
The optimization algorithm requires an objective function to optimize. It must take a set of coefficients and return a score that is to be minimized or maximized corresponding to a better model.
In this case, we will evaluate the mean squared error of the model with a given set of coefficients and return the error score, which must be minimized.
The objective() function below implements this, given the dataset and a set of coefficients, and returns the error of the model.
# objective function
def objective(X, y, coefficients):
# generate predictions for dataset
yhat = predict_dataset(X, coefficients)
# calculate accuracy
score = mean_squared_error(y, yhat)
return score
Next, we can define the stochastic hill climbing algorithm.
The algorithm will require an initial solution (e.g. random coefficients) and will iteratively keep making small changes to the solution and checking if it results in a better performing model. The amount of change made to the current solution is controlled by a step_size hyperparameter. This process will continue for a fixed number of iterations, also provided as a hyperparameter.
The hillclimbing() function below implements this, taking the dataset, objective function, initial solution, and hyperparameters as arguments and returns the best set of coefficients found and the estimated performance.
# hill climbing local search algorithm
def hillclimbing(X, y, objective, solution, n_iter, step_size):
# evaluate the initial point
solution_eval = objective(X, y, solution)
# run the hill climb
for i in range(n_iter):
# take a step
candidate = solution + randn(len(solution)) * step_size
# evaluate candidate point
candidte_eval = objective(X, y, candidate)
# check if we should keep the new point
if candidte_eval <= solution_eval:
# store the new point
solution, solution_eval = candidate, candidte_eval
# report progress
print('>%d %.5f' % (i, solution_eval))
return [solution, solution_eval]
We can then call this function, passing in an initial set of coefficients as the initial solution and the training dataset as the dataset to optimize the model against.
...
# define the total iterations
n_iter = 2000
# define the maximum step size
step_size = 0.15
# determine the number of coefficients
n_coef = X.shape[1] + 1
# define the initial solution
solution = rand(n_coef)
# perform the hill climbing search
coefficients, score = hillclimbing(X_train, y_train, objective, solution, n_iter, step_size)
print('Done!')
print('Coefficients: %s' % coefficients)
print('Train MSE: %f' % (score))
Finally, we can evaluate the best model on the test dataset and report the performance.
...
# generate predictions for the test dataset
yhat = predict_dataset(X_test, coefficients)
# calculate accuracy
score = mean_squared_error(y_test, yhat)
print('Test MSE: %f' % (score))
Tying this together, the complete example of optimizing the coefficients of a linear regression model on the synthetic regression dataset is listed below.
# optimize linear regression coefficients for regression dataset
from numpy.random import randn
from numpy.random import rand
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# linear regression
def predict_row(row, coefficients):
# add the bias, the last coefficient
result = coefficients[-1]
# add the weighted input
for i in range(len(row)):
result += coefficients[i] * row[i]
return result
# use model coefficients to generate predictions for a dataset of rows
def predict_dataset(X, coefficients):
yhats = list()
for row in X:
# make a prediction
yhat = predict_row(row, coefficients)
# store the prediction
yhats.append(yhat)
return yhats
# objective function
def objective(X, y, coefficients):
# generate predictions for dataset
yhat = predict_dataset(X, coefficients)
# calculate accuracy
score = mean_squared_error(y, yhat)
return score
# hill climbing local search algorithm
def hillclimbing(X, y, objective, solution, n_iter, step_size):
# evaluate the initial point
solution_eval = objective(X, y, solution)
# run the hill climb
for i in range(n_iter):
# take a step
candidate = solution + randn(len(solution)) * step_size
# evaluate candidate point
candidte_eval = objective(X, y, candidate)
# check if we should keep the new point
if candidte_eval <= solution_eval:
# store the new point
solution, solution_eval = candidate, candidte_eval
# report progress
print('>%d %.5f' % (i, solution_eval))
return [solution, solution_eval]
# define dataset
X, y = make_regression(n_samples=1000, n_features=10, n_informative=2, noise=0.2, random_state=1)
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
# define the total iterations
n_iter = 2000
# define the maximum step size
step_size = 0.15
# determine the number of coefficients
n_coef = X.shape[1] + 1
# define the initial solution
solution = rand(n_coef)
# perform the hill climbing search
coefficients, score = hillclimbing(X_train, y_train, objective, solution, n_iter, step_size)
print('Done!')
print('Coefficients: %s' % coefficients)
print('Train MSE: %f' % (score))
# generate predictions for the test dataset
yhat = predict_dataset(X_test, coefficients)
# calculate accuracy
score = mean_squared_error(y_test, yhat)
print('Test MSE: %f' % (score))
Running the example will report the iteration number and mean squared error each time there is an improvement made to the model.
At the end of the search, the performance of the best set of coefficients on the training dataset is reported and the performance of the same model on the test dataset is calculated and reported.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the optimization algorithm found a set of coefficients that achieved an error of about 0.08 on both the train and test datasets.
The fact that the algorithm found a model with very similar performance on train and test datasets is a good sign, showing that the model did not over-fit (over-optimize) to the training dataset. This means the model generalizes well to new data.
Now that we are familiar with how to manually optimize the coefficients of a linear regression model, let’s look at how we can extend the example to optimize the coefficients of a logistic regression model for classification.
Optimize a Logistic Regression Model
A Logistic Regression model is an extension of linear regression for classification predictive modeling.
Logistic regression is for binary classification tasks, meaning datasets that have two class labels, class=0 and class=1.
The output first involves calculating the weighted sum of the inputs, then passing this weighted sum through a logistic function, also called a sigmoid function. The result is a Binomial probability between 0 and 1 for the example belonging to class=1.
In this section, we will build on what we learned in the previous section to optimize the coefficients of regression models for classification. We will develop the model and test it with random coefficients, then use stochastic hill climbing to optimize the model coefficients.
First, let’s define a synthetic binary classification problem that we can use as the focus of optimizing the model.
We can use the make_classification() function to define a binary classification problem with 1,000 rows and five input variables.
The example below creates the dataset and summarizes the shape of the data.
# define a binary classification dataset
from sklearn.datasets import make_classification
# define dataset
X, y = make_classification(n_samples=1000, n_features=5, n_informative=2, n_redundant=1, random_state=1)
# summarize the shape of the dataset
print(X.shape, y.shape)
Running the example prints the shape of the created dataset, confirming our expectations.
(1000, 5) (1000,)
Next, we need to define a logistic regression model.
Let’s start by updating the predict_row() function to pass the weighted sum of the input and coefficients through a logistic function.
The logistic function is defined as:
logistic = 1.0 / (1.0 + exp(-result))
Where result is the weighted sum of the inputs and the coefficients and exp() is e (Euler’s number) raised to the power of the provided value, implemented via the exp() function.
The updated predict_row() function is listed below.
# logistic regression
def predict_row(row, coefficients):
# add the bias, the last coefficient
result = coefficients[-1]
# add the weighted input
for i in range(len(row)):
result += coefficients[i] * row[i]
# logistic function
logistic = 1.0 / (1.0 + exp(-result))
return logistic
That’s about it in terms of changes for linear regression to logistic regression.
As with linear regression, we can test the model with a set of random model coefficients.
...
# determine the number of coefficients
n_coeff = X.shape[1] + 1
# generate random coefficients
coefficients = rand(n_coeff)
# generate predictions for dataset
yhat = predict_dataset(X, coefficients)
The predictions made by the model are probabilities for an example belonging to class=1.
We can round the prediction to be integer values 0 and 1 for the expected class labels.
...
# round predictions to labels
yhat = [round(y) for y in yhat]
We can evaluate the classification accuracy of these predictions.
We can tie all of this together and demonstrate our simple logistic regression model for binary classification. The complete example is listed below.
# logistic regression function for binary classification
from math import exp
from numpy.random import rand
from sklearn.datasets import make_classification
from sklearn.metrics import accuracy_score
# logistic regression
def predict_row(row, coefficients):
# add the bias, the last coefficient
result = coefficients[-1]
# add the weighted input
for i in range(len(row)):
result += coefficients[i] * row[i]
# logistic function
logistic = 1.0 / (1.0 + exp(-result))
return logistic
# use model coefficients to generate predictions for a dataset of rows
def predict_dataset(X, coefficients):
yhats = list()
for row in X:
# make a prediction
yhat = predict_row(row, coefficients)
# store the prediction
yhats.append(yhat)
return yhats
# define dataset
X, y = make_classification(n_samples=1000, n_features=5, n_informative=2, n_redundant=1, random_state=1)
# determine the number of coefficients
n_coeff = X.shape[1] + 1
# generate random coefficients
coefficients = rand(n_coeff)
# generate predictions for dataset
yhat = predict_dataset(X, coefficients)
# round predictions to labels
yhat = [round(y) for y in yhat]
# calculate accuracy
score = accuracy_score(y, yhat)
print('Accuracy: %f' % score)
Running the example generates a prediction for each example in the training dataset then prints the classification accuracy for the predictions.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
We would expect about 50 percent accuracy given a set of random weights and a dataset with an equal number of examples in each class, and that is approximately what we see in this case.
Accuracy: 0.540000
We can now optimize the weights of the dataset to achieve good accuracy on this dataset.
The stochastic hill climbing algorithm used for linear regression can be used again for logistic regression.
The important difference is an update to the objective() function to round the predictions and evaluate the model using classification accuracy instead of mean squared error.
# objective function
def objective(X, y, coefficients):
# generate predictions for dataset
yhat = predict_dataset(X, coefficients)
# round predictions to labels
yhat = [round(y) for y in yhat]
# calculate accuracy
score = accuracy_score(y, yhat)
return score
The hillclimbing() function also must be updated to maximize the score of solutions instead of minimizing in the case of linear regression.
# hill climbing local search algorithm
def hillclimbing(X, y, objective, solution, n_iter, step_size):
# evaluate the initial point
solution_eval = objective(X, y, solution)
# run the hill climb
for i in range(n_iter):
# take a step
candidate = solution + randn(len(solution)) * step_size
# evaluate candidate point
candidte_eval = objective(X, y, candidate)
# check if we should keep the new point
if candidte_eval >= solution_eval:
# store the new point
solution, solution_eval = candidate, candidte_eval
# report progress
print('>%d %.5f' % (i, solution_eval))
return [solution, solution_eval]
Finally, the coefficients found by the search can be evaluated using classification accuracy at the end of the run.
...
# generate predictions for the test dataset
yhat = predict_dataset(X_test, coefficients)
# round predictions to labels
yhat = [round(y) for y in yhat]
# calculate accuracy
score = accuracy_score(y_test, yhat)
print('Test Accuracy: %f' % (score))
Tying this all together, the complete example of using stochastic hill climbing to maximize classification accuracy of a logistic regression model is listed below.
# optimize logistic regression model with a stochastic hill climber
from math import exp
from numpy.random import randn
from numpy.random import rand
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# logistic regression
def predict_row(row, coefficients):
# add the bias, the last coefficient
result = coefficients[-1]
# add the weighted input
for i in range(len(row)):
result += coefficients[i] * row[i]
# logistic function
logistic = 1.0 / (1.0 + exp(-result))
return logistic
# use model coefficients to generate predictions for a dataset of rows
def predict_dataset(X, coefficients):
yhats = list()
for row in X:
# make a prediction
yhat = predict_row(row, coefficients)
# store the prediction
yhats.append(yhat)
return yhats
# objective function
def objective(X, y, coefficients):
# generate predictions for dataset
yhat = predict_dataset(X, coefficients)
# round predictions to labels
yhat = [round(y) for y in yhat]
# calculate accuracy
score = accuracy_score(y, yhat)
return score
# hill climbing local search algorithm
def hillclimbing(X, y, objective, solution, n_iter, step_size):
# evaluate the initial point
solution_eval = objective(X, y, solution)
# run the hill climb
for i in range(n_iter):
# take a step
candidate = solution + randn(len(solution)) * step_size
# evaluate candidate point
candidte_eval = objective(X, y, candidate)
# check if we should keep the new point
if candidte_eval >= solution_eval:
# store the new point
solution, solution_eval = candidate, candidte_eval
# report progress
print('>%d %.5f' % (i, solution_eval))
return [solution, solution_eval]
# define dataset
X, y = make_classification(n_samples=1000, n_features=5, n_informative=2, n_redundant=1, random_state=1)
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
# define the total iterations
n_iter = 2000
# define the maximum step size
step_size = 0.1
# determine the number of coefficients
n_coef = X.shape[1] + 1
# define the initial solution
solution = rand(n_coef)
# perform the hill climbing search
coefficients, score = hillclimbing(X_train, y_train, objective, solution, n_iter, step_size)
print('Done!')
print('Coefficients: %s' % coefficients)
print('Train Accuracy: %f' % (score))
# generate predictions for the test dataset
yhat = predict_dataset(X_test, coefficients)
# round predictions to labels
yhat = [round(y) for y in yhat]
# calculate accuracy
score = accuracy_score(y_test, yhat)
print('Test Accuracy: %f' % (score))
Running the example will report the iteration number and classification accuracy each time there is an improvement made to the model.
At the end of the search, the performance of the best set of coefficients on the training dataset is reported and the performance of the same model on the test dataset is calculated and reported.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the optimization algorithm found a set of weights that achieved about 87.3 percent accuracy on the training dataset and about 83.9 percent accuracy on the test dataset.
Tue Feb 09 2021 16:27:20 GMT+0700 (Western Indonesia Time)
Just when vaccines were approved and began to be distributed, COVID-19’s first troubling variants started to rear their ugly heads. The variants, particularly those from South Africa and the United Kingdom, possess troubling traits like higher infectiousness, higher risks of mortality and greater abilities to evade both natural antibodies and vaccines. With that, the next great front of the war against COVID-19 has opened – and as always, cutting-edge technology is on the front lines. Researchers from the Viterbi School of Engineering at the University of Southern California (USC) are now using AI to identify the best vaccines to fend off the new forms of the coronavirus.
Leveraging a massive bioinformatics database called the Immune Epitope Database (IEDB), the team’s machine learning model rapidly assesses vaccines for their efficacy against a given variant of SARS-CoV-2, dramatically compressing a design pipeline that used to take months. In testing, it quickly ruled out 95% of the possible compounds and identified 26 potential vaccine candidates.
“This AI framework, applied to the specifics of this virus, can provide vaccine candidates within seconds and move them to clinical trials quickly to achieve preventive medical therapies without compromising safety,” said Paul Bogdan, an associate professor of electrical and computer engineering at USC and one of the authors of the study, in an interview with USC’s Gary Polakovic. “Moreover, this can be adapted to help us stay ahead of the coronavirus as it mutates around the world.”
The AI vaccine workflow. Image courtesy of the researchers.
After applying the machine learning model, the researchers whittled the resulting 26 candidates down to 11 that they believed could constitute a promising multi-epitope vaccine to attack the virus on multiple fronts. The team believes that the model can be used to design a new vaccine for another virus in less than an hour, including validation.
While this solution follows the remarkably effective vaccines from Moderna and Pfizer, the researchers are confident that it will prove useful as vaccine-makers work furiously to adapt to the new variations. “The proposed vaccine design framework can tackle the three most frequently observed mutations and be extended to deal with other potentially unknown mutations,” Bogdan said.
There’s also room for expansion: the scientists limited themselves to one B-cell epitope and one T-cell epitope, but casting a wider net and allowing for more possible combinations could allow for the design of even more multifaceted vaccines to tackle yet more challenging mutations.
The paper, written by Zikun Yang, Paul Bogdan, and Shahin Nazarian, was published in Scientific Reports and is accessible here.
Tue Feb 09 2021 15:51:00 GMT+0700 (Western Indonesia Time)
Do you need to access management information in an enterprise environment from your Delphi Application? Don’t know where to start with ? Don’t worry. MiTec’s System Information Management Suite’s component helps to accessing systems, applications, networks, devices, and other managed components with less code and we will learn how to use MiTeC_WbemScripting_TLB in this blog post. For more info on Windows Management Instrumentation (WMI) check here
Platforms: Windows.
Installation Steps:
You can easily install this Component Suite from GetIt Package Manager. The steps are as follows.
Navigate In RAD Studio IDE->Tools->GetIt Package Manager->select Components in Categories->Components->Trail -MiTec system Information Component Suite 14.3 and click Install Button.
Read the license and Click Agree All. An Information dialog saying ‘Requires a restart of RAD studio at the end of the process. Do you want to proceed? click yes and continue.
It will download the plugin and installs it. Once installed Click Restart now.
How to run the Demo app:
Navigate to the System Information Management Suite trails setup, Demos folder which is installed during Get It installation e.g) C:UsersDocumentsEmbarcaderoStudio21.0CatalogRepositoryMiTeC-14.3DemosDelphi7
Open the WMIDemo project in RAD studio 10.4.1 compile and Run the application.
This Demo App shows how to use MiTeC_WbemScripting_TLB’s ISWbemServices and list the Computer, Operating system, Processor, Memory, Storage etc.
Components used in MSIC WMIDemo App:
3 TEdit‘s to provide machine name, username, password in a enterprise network which helps to connect and access the management information.
TTreeView to show the Computer, Operating system, Processor, Memory, Storage etc. in a tree view.
TButton to refresh and close.
Implementation Details:
Connect to the Machine from the provided machine, username and password details using WMIConnect. An interface variable of type ISWbemServices’s reference is acquired during this connect operation.
A WMICommand call helps to retrieve the system information such as operating system, processor, etc. as shown below.
procedure TForm1.RefreshData;
var
i,j,k: Integer;
r,n,c: TTreeNode;
wmiServices: ISWbemServices;
wmi,wmi1,wmi2,wmi3: TInstances;
s,s1,s2: string;
v: Int64;
begin
Screen.Cursor:=crHourglass;
Tree.Hide;
Tree.Items.BeginUpdate;
Update;
try
Tree.Items.Clear;
if not WMIConnect(eMachine.Text,eUser.Text,ePwd.Text,Rootnamespace,wmiServices) then
Exit;
WMICommand(wmiServices,'Win32_ComputerSystem',wmi1);
r:=Tree.Items.AddChild(nil,'Computer');
n:=Tree.Items.AddChild(r,Format('%s - %s',[GetInstancePropertyValue(wmi1,'Name'),
GetInstancePropertyValue(wmi1,'UserName')]));
WMICommand(wmiServices,'Win32_OperatingSystem',wmi);
r:=Tree.Items.AddChild(nil,'Operating system');
n:=Tree.Items.AddChild(r,GetInstancePropertyValue(wmi,'Name'));
WMICommand(wmiServices,'Win32_Processor',wmi);
r:=Tree.Items.AddChild(nil,'CPU');
for i:=0 to High(wmi) do begin
n:=Tree.Items.AddChild(r,Format('%s - %s MHz',[GetInstancePropertyValue(wmi,'Name'),GetInstancePropertyValue(wmi,'CurrentClockSpeed')]));
c:=Tree.Items.AddChild(n,GetInstancePropertyValue(wmi,'Description'));
end;
r:=Tree.Items.AddChild(nil,'Memory');
try v:=StrToInt64(GetInstancePropertyValue(wmi1,'TotalPhysicalMemory')) except v:=0 end;
n:=Tree.Items.AddChild(r,Format('%d MB',[v shr 20]));
WMICommand(wmiServices,'Win32_DiskDrive',wmi);
r:=Tree.Items.AddChild(nil,'Storage');
for i:=0 to High(wmi) do begin
try v:=StrToInt64(GetInstancePropertyValue(wmi,'Size',i)) except v:=0 end;
n:=Tree.Items.AddChild(r,Format('%s - %d MB',[GetInstancePropertyValue(wmi,'Model',i),
v shr 20]));
WMICommand(wmiServices,Format('select * from Win32_DiskPartition where DiskIndex=%s',[GetInstancePropertyValue(wmi,'Index',i)]),wmi1);
WMICommand(wmiServices,'Win32_LogicalDiskToPartition',wmi2);
for j:=0 to High(wmi1) do begin
for k:=0 to High(wmi2) do begin
s1:=GetInstancePropertyValue(wmi1,'DeviceID',j);
s2:=GetInstancePropertyValue(wmi2,'Antecedent',k);
if Pos(s1,s2)>0 then begin
s:=GetInstancePropertyValue(wmi2,'Dependent',k);
s:=Copy(s,Pos(':"',s)-1,2);
WMICommand(wmiServices,Format('select * from Win32_LogicalDisk where DeviceId=''%s''',[s]),wmi3);
try v:=StrToInt64(GetInstancePropertyValue(wmi,'Size',i)) except v:=0 end;
c:=Tree.Items.AddChild(n,Format('%s [%s] - %d MB - %s',[s,GetInstancePropertyValue(wmi3,'VolumeName',0),v shr 20,GetInstancePropertyValue(wmi3,'FileSystem',0)]));
end;
end;
end;
end;
WMICommand(wmiServices,'Win32_CDROMDrive',wmi);
for i:=0 to High(wmi) do begin
n:=Tree.Items.AddChild(r,GetInstancePropertyValue(wmi,'Name',i));
c:=Tree.Items.AddChild(n,GetInstancePropertyValue(wmi,'Id',i));
end;
WMICommand(wmiServices,'Win32_TapeDrive',wmi);
for i:=0 to High(wmi) do begin
n:=Tree.Items.AddChild(r,GetInstancePropertyValue(wmi,'Name',i));
c:=Tree.Items.AddChild(n,GetInstancePropertyValue(wmi,'Id',i));
end;
WMICommand(wmiServices,'Win32_VideoController',wmi);
r:=Tree.Items.AddChild(nil,'Graphics');
try v:=StrToInt(GetInstancePropertyValue(wmi,'AdapterRAM')) except v:=0 end;
n:=Tree.Items.AddChild(r,Format('%s - %d MB',[GetInstancePropertyValue(wmi,'Name'),v shr 20]));
WMICommand(wmiServices,'Win32_DesktopMonitor',wmi);
r:=Tree.Items.AddChild(nil,'Monitor');
for i:=0 to High(wmi) do begin
n:=Tree.Items.AddChild(r,Format('%s - (%s x %s) px',[GetInstancePropertyValue(wmi,'Name'),
GetInstancePropertyValue(wmi,'ScreenWidth'),
GetInstancePropertyValue(wmi,'ScreenHeight')]));
end;
WMICommand(wmiServices,'Win32_SoundDevice',wmi);
r:=Tree.Items.AddChild(nil,'Audio');
for i:=0 to High(wmi) do begin
n:=Tree.Items.AddChild(r,GetInstancePropertyValue(wmi,'Name',i));
end;
WMICommand(wmiServices,'Win32_NetworkAdapter',wmi);
r:=Tree.Items.AddChild(nil,'Network');
for i:=0 to High(wmi) do begin
WMICommand(wmiServices,Format('select * from Win32_NetworkAdapterConfiguration where Caption=''%s''',[GetInstancePropertyValue(wmi,'Caption',i)]),wmi1);
s1:=GetInstancePropertyValue(wmi,'MACAddress',i);
s2:=GetInstancePropertyValue(wmi1,'IPAddress',0);
if not SameText(s1,'NULL') and not SameText(s2,'NULL') then begin
n:=Tree.Items.AddChild(r,GetInstancePropertyValue(wmi,'Name',i));
c:=Tree.Items.AddChild(n,s1);
c:=Tree.Items.AddChild(n,s2);
end;
end;
WMICommand(wmiServices,'Win32_Printer',wmi);
r:=Tree.Items.AddChild(nil,'Printers');
for i:=0 to High(wmi) do begin
n:=Tree.Items.AddChild(r,GetInstancePropertyValue(wmi,'Name',i));
end;
Tree.FullExpand;
Tree.Items.GetFirstNode.MakeVisible;
finally
WMIDisconnect(wmiServices);
Finalize(wmi);
Finalize(wmi1);
Finalize(wmi2);
Tree.Items.EndUpdate;
Tree.Show;
Screen.Cursor:=crdefault;
end;
end;
MiTeC WMIDemo
Developers can use this MiTeC Component suite and able to obtain management data to automate administrative tasks on remote computers quickly.
procedure TFormJws.btnVerifyClick(Sender: TObject);
begin
ipcJWS1.Reset();
if (CompareStr(cboAlgorithm.Text,'HS256') = 0) or (CompareStr(cboAlgorithm.Text,'HS384') = 0) or (CompareStr(cboAlgorithm.Text,'HS512') = 0) then
begin
ipcJWS1.Config('KeyEncoding=1');
ipcJWS1.Key:=txtKey.Text;
end
else if (CompareStr(cboAlgorithm.Text,'RS256') = 0) or (CompareStr(cboAlgorithm.Text,'RS384') = 0) or (CompareStr(cboAlgorithm.Text,'RS512') = 0) or
(CompareStr(cboAlgorithm.Text,'PS256') = 0) or (CompareStr(cboAlgorithm.Text,'PS384') = 0) or (CompareStr(cboAlgorithm.Text,'PS512') = 0) then
begin
ipcJWS1.CertStoreType:=cstPEMKeyFile;
ipcJWS1.CertStore:=txtPublicFile.Text;
ipcJWS1.CertSubject:='*';
end
else if (CompareStr(cboAlgorithm.Text,'ES256') = 0) or (CompareStr(cboAlgorithm.Text,'ES384') = 0) or (CompareStr(cboAlgorithm.Text,'ES512') = 0) then
begin
ipcJWS1.CertStoreType:=cstPublicKeyFile;
ipcJWS1.CertStore:=txtPublicFile.Text;
ipcJWS1.CertSubject:='*';
end;
ipcJWS1.InputMessage:=txtSigned.Text;
ipcJWS1.Verify();
txtMessage.Text:=ipcJWS1.OutputMessage;
txtSigned.Text:='';
end;
The Delphi/RAD Studio ecosystem relies on many component partners to support the diverse needs of developers. The component market has been around for over 20 years and continues to thrive. Many partners stand out with their excellent portfolios of products that help developers deploy professional apps faster. Even more importantly, many are on the cutting edge of innovation, helping advance what can be achieved with Delphi and RAD Studio.
We enjoy working closely with our many Technology Partners. Companies like DevExpress, TMS Software, and DelphiStyles are instrumental in bringing to developers the tools they need to succeed. Many share rich histories of collaboration with Embarcadero, and we love learning from them. I recently spoke with Ray Navasarkian of DevExpress and thought it would be fun to share some of his perspectives. We plan to make this discussion part of a longer series.
What is your vision for DevExpress?
The word “vision” may sound trite, so I think it is best to consider our guiding principles. Number one is that we conduct business ethically and with absolute integrity. We would be nothing without our customers. As such, we owe them the truth. When we are able, we promise and deliver to the best of our abilities. When we cannot, we let them know that we are simply unable. We do not always get this right and we definitely make mistakes, but our objective is simple—to engage our customers in a fair and honest manner, each and every day.
The second guiding principle is to deliver exceptional products that meet and exceed expectations. Like the first guiding principle, this is not easy to pull off, but I think the quality of our VCL product line speaks to our overall success in this regard. We started DevExpress in 1998 because we love Delphi and saw an opportunity to innovate in the VCL component space. We saw that the VCL component market needed an “Outlook-inspired” data grid component. Data grids are key UI elements in most desktop apps, and Microsoft’s Office 97 UI overhaul gave us the opportunity to enter the VCL component market with a bang. The rest, as they say, is history.
It has been 20-plus years since those halcyon days. We launched some great products and had our share of our lackluster releases, but on the whole, I’m proud of what we’ve achieved in the VCL market. I think we offer our loyal customers a robust set of UI components that effectively address a broad range of usage scenarios.
Thanks to the great relationship with Embarcadero and terrific feedback from our loyal customers, I expect to deliver much more over the next 20 years. Long live RAD Studio.
What is the main focus for DevExpress today?
DevExpress manages a massive product portfolio that extends beyond UI components for RAD Studio. While it is not always easy, we do our best to innovate on multiple fronts and address developer needs on multiple development platforms.
When it comes to RAD Studio, new products and features are shaped by user demand and market requirements. We remain fully focused on VCL because of our large developer community—a community that remains committed to both RAD Studio and our VCL product line.
Our biggest challenge today is the proliferation of new development platforms. It is not always easy to meet and exceed expectations when you must juggle new platforms alongside legacy platforms. Consider our VCL product line. We ship over 200 UI controls and libraries. Over the years, a handful of users asked that we port our UI controls to FMX. Though I would have loved to do so, our resources are finite. As such, we had to make the tough decision to forgo FMX development and focus our energies on the VCL.
We did release an FMX data grid last year. While we ultimately chose to cease FMX development at this time, we remain open-minded to its possibilities. If our customers choose FMX over the VCL, then we will reallocate resources as needed. In the interim, we may make our FMX grid available to our community free of charge.
What is your opinion on complete libraries of components versus best-in-class components? We have a few of our own in JavaScript, and we see there that best-in-class appears to be a stronger formula.
I would argue that the underlying component requirements for desktop developers differ from those of web developers. When we released our first VCL product, we had to quickly follow up with other major UI elements such as a Ribbon, Calendar, etc. Part of the reason for this involved appearance and overall look and feel. Our customers did not want to mix and match UI elements from different vendors within a single desktop app. While web developers also do not necessarily want to mix and match, I believe they are more willing to invest in best-in-class products versus a single monolithic component library.
To put it differently, I do think that a single best-in-class component can survive in the JavaScript space. My experience over the years tells me that it is much harder to do the same in the desktop space. I could be wrong of course, but I do recall a vendor in the Microsoft component ecosystem who is no longer in business because they failed to support their best-in-class UI component with auxiliary UI controls. As competitors caught up to this vendor’s best-in-class feature set, its market share eroded quite quickly.
Of course, certain component libraries can be integrated more independently within a desktop app. This includes charting, document management, and reporting. Our product line is a perfect example. As you know, we do not offer charts or reporting for the VCL. It is not to say that users do not ask—we are routinely asked to deliver a charting and reporting library for RAD Studio.
While mixing and matching is more likely in web development, the ability to work with a single vendor—a vendor that delivers on its promises—seems to me the ideal. Mixing and matching UI tools may affect productivity, may increase maintenance costs, and of course will affect upgrade paths.
UX is very important for modern applications. One of the hurdles that some in our community experience, especially in mobile development, is that the quality of the UI can vary significantly. What are your thoughts on the future of UX development in RAD Studio?
We are very proud of our past achievements, but we still have a lot of work to do for the VCL and RAD Studio developers. UX standards evolve, and we must do the same. It is not always easy, but our close relationship with Embarcadero should help us address the UX needs of our mutual customers for years to come.
As you know, Embarcadero recently hosted a Desktop Summit where we presented our POV on UI design. I look forward to additional opportunities in this regard. I think everyone in the RAD Studio developer community benefits when component vendors freely share their perspectives on UI design.
What do you think is the impact of low code in the components space?
I am confident opportunities exist in the low-code space. At the end of the day, the marketplace dictates what we do and how we do it. If low code becomes ubiquitous, we will adapt accordingly.
For now, native application development remains the top priority at DevExpress. As you know, we released a major update to our VCL product line in December. This release included a new VCL Gantt control and updates to our Data Grid, Spreadsheet, and PDF Viewer for the VCL. DirectX also plays an important role in our desktop development strategy. Hopefully, we can discuss why we are moving away from GDI and toward DirectX in a future interview. Check out a complete summary of major features we shipped late last year.
Thanks for the opportunity to discuss DevExpress with the Embarcadero developer community.
Tue Feb 09 2021 01:00:01 GMT+0700 (Western Indonesia Time)
Navicatは、数多くのデータベースサーバーやクラウドデータベースプラットフォームをサポートした強力なデータベース開発ツールで、Delphiによって構築されています。Navicatにはさまざまなバージョンが用意されており、各バージョンで1つのデータベースをサポートしていますが、単一製品ですべてのデータベースをサポートするNavicat Premium for Windowsも提供されています。その顧客には、Adobe、Sony、HP、Disney、MasterCard、Nike、Samsungなどがリストされています。
Mon Feb 08 2021 23:12:51 GMT+0700 (Western Indonesia Time)
Teradata’s market capitalization has grown about $2 billion during the past two trading sessions and is trading near a two-year high thanks to better-than-expected financial results announced Thursday afternoon. The San Diego analytics software company attributed its strong earnings to strong adoption of its software in the cloud.
During the fourth quarter of fiscal year 2020 ended December 31, Teradata’s total revenue was actually down, from $494 million a year ago to $491 million in the quarter that just ended. For the year, the company reported a 3% drop in total revenue, from $1.89 billion to $1.84 billion.
But it was the type of revenue that drew investors’ attention. In the fourth quarter, its annual recurring revenue (ARR) grew by 11%, from $1.43 billion to $1.59 billion, compared to the fourth quarter of 2019 (9% at constant currency).
What’s more, the public cloud component of that spending amounted to $106 million, which was a 165% increase from the same quarter a year ago (159% at constant currency). These figures show that Teradata’s cloud and subscription business grew at a surprisingly fast pace.
“Our Cloud-First focus has been recognized by our customers and the marketplace,” Teradata President and CEO Steve McMillan stated in a press release. “Our cloud momentum has contributed to another strong quarter of performance, as we exceeded quarterly expectations for recurring revenue, profitability, and free cash flow.”
Teradata has been under pressure to transition its data warehousing and analytics software business from an on-premise, perpetual-license model to a cloud-first, subscription model. The company has adapted its Vantage platform to run on all three major public clouds, giving it cloud-based options to compete against AWS Redshift, Microsoft Azure Synapse, and Google Cloud Big Query, as well as Snowflake, which is arguably its biggest competitor.
In a recent interview with Datanami, McMillan predicted that the company would be turning heads and changing perceptions.
“Teradata has done a really good job of hiding how good we are in the cloud,” McMillan said. “We have had a good cloud product. It’s getting better all the time.”
Teradata’s stock is trading near a two-year high
McMillan pointed to several moves that Teradata made in 2020 that helped to solidify its cloud business, including going native on Google Cloud and enabling its data warehouse to run on object stores, as opposed to requiring that data is stored its own proprietary database. Shifting to consumption-based pricing (“You only pay for what you’re using”) and paring back its services firm, also helped, he added.
“We set out some really good foundations in the cloud, and I think a lot of folks just don’t know about it,” McMillan said. “I think what we have to do is really work out how to get that message and perspective out there that we have a fantastic technology.”
McMillan joined Teradata as the CEO and president last June. His predecessor in the CEO’s chair, Oliver Ratzesberger, lasted less than a year and left the company in December 2019 as the company struggled to gain traction as the market for data analytics software shifted rapidly to the cloud. Vic Lund, who preceded Ratzesberger as CEO, took the position.
While the cloud clearly will be a key to longevity for McMillan, it doesn’t mean that the company is making a complete break from its history (although clearly the days of running data warehouses on expensive, proprietary hardware is over).
McMillan maintains that Teradata’s 40 years of experience in building data warehouses and analytics systems gives it a key competitive advantage that can’t be easily replicated, particularly in areas like work management and data governance, as well as connecting analytics to business outcomes.
“Our history, the knowledge that we’ve got in terms of helping some of the world’s largest telecos re-imagine how to use data based on their subscribers and devices and their 5G network and orchestrate that data across all of their supply chain and value chain and deliver that as set of results–taking those kinds of experiences and delivering them on a day-to-day basis, and working with the partners and large system integrators to do that–is a real differentiator,” McMillan said.
Wall Street rewarded Teradata (NYSE: TDC) as soon as its results were announced Thursday afternoon. The company’s stock rose from about $27 per share at the Thursday closing to $37 per share at the Friday closing. It rose again today and reached a 23-month high of $49.05 before closing at around $48.
Mon Feb 08 2021 19:57:02 GMT+0700 (Western Indonesia Time)
Computer Graphics Programming class is one of the interesting ones in any computer science undergraduate program. This semester I am taking this course as my core science course, and it is getting fascinating every topic. Since most of the universities teach programming in C++ or Java, I am using the “Computer Graphics Programming In OpenGL With Java” book as my primary source now. Furthermore, knowing matrix algebra is somehow required for learning computer graphics, which I have done in my first semester within the Applied Math class.
I found out that learning computer graphics with higher-level languages is better than learning in C. For instance, higher-level languages are convenient for beginners. Moreover handling events, input-output operations, and object-oriented design patterns are helpful when writing cleaner, and good code. The beautiful part of this class is you learn how to utilize the power of the GPU! And exploring the parallel architecture of the GPU is one of the essential parts of graphics programming.
Actually, this post is about Shader Programming in Delphi FireMonkey. FireMonkey is a cross-platform UI framework and written to use the GPU where possible. And the 3D scene environment is one of the best features of the FireMonkey.
Erik van Bilsen who is one of the Embarcadero Delphi MVPs has written a long blog post about Shader Programming in Delphi FireMonkey. In his blog post, you can learn how to utilize the power of FireMonkey 3D development. He has developed 6 different sample projects to demonstrate the use of custom materials and shaders in Delphi FireMonkey.
procedure TFormMain.Form3DCreate(Sender: TObject);
begin
LabelBackend.Text := 'Backend: ' + Context.ClassName;
FMaterialSource := TBlueMaterialSource.Create(Self);
Plane.MaterialSource := FMaterialSource;
end;
procedure TFormMain.Form3DRender(Sender: TObject; Context: TContext3D);
begin
{$IF Defined(MACOS) and not Defined(IOS)}
{ Workaround for https://quality.embarcadero.com/browse/RSP-32121 }
if (GlobalUseMetal) then
Context.FillRect(Point3D(-Width, -Height, 100), Point3D(Width, Height, 100), 1, Color);
{$ENDIF}
end;
In the first sample, the demo application just renders every pixel using a blue color. And, shows you how to configure your application to utilize custom materials and shaders which is the fundamental part before doing anything else.
Stay tuned, and we will learn other samples in coming posts.
Mon Feb 08 2021 17:00:45 GMT+0700 (Western Indonesia Time)
The corporate network perimeter has been completely redefined. Many IT leaders are adopting a Zero Trust security model where identities play a critical role in helping act as the foundation of their modern cybersecurity strategy. As a result, cybercriminals have shifted their focus and identities are increasingly under attack.
In this infographic, we explore how this shift is affecting IT leaders and how Microsoft can help apply threat protection to proactively prevent identity compromise and reduce alert fatigue.
There’s been a significant increase in identity-based attacks. As IT leaders rely more heavily on identity in their security strategies, cybercriminals have increased their efforts on this threat vector. And with the shift to remote work in response to COVID-19, we’ve seen a notable number of pandemic-related phishing attacks.
IT leaders need more visibility and protection. With the increase in threats, security professionals and admins are being overwhelmed with alerts. IT leaders are looking for more effective ways to manage alerts and better tools to proactively prevent attackers from being able to compromise accounts.
Preventing identity compromise is more critical than ever. As IT leaders evolve their security strategies, people increasingly working remotely, and the number of identity-based attacks are rising, it’s vital for organizations to implement real-time, AI-based protections that prevent identity compromise.
If you’re interested in how Microsoft can help, see how Azure Active Directory (Azure AD) Identity Protection and Microsoft 365 Defender use real-time, cloud-based AI to proactively prevent identity compromise. Also check out our Security Unlocked podcast with Data Scientist Lead for Microsoft’s Identity Security and Protection team, Maria Peurtas Calvo, to hear how AI is being used to protect identities inside Microsoft products and services.
Visit our Zero Trust page to stay up-to-date on how the latest Microsoft products, features, and resources that can help you implement Zero Trust principles in your organization.
To learn more about Microsoft Security solutions visit our website. Bookmark the Security blog to keep up with our expert coverage on security matters. Also, follow us at @MSFTSecurity for the latest news and updates on cybersecurity.
Mon Feb 08 2021 13:30:04 GMT+0700 (Western Indonesia Time)
Monitoring CPU usage becomes essential use case in some of the applications. Don’t know how to monitor the CPU usage in your Delphi Applications? Don’t worry. MiTec’s System Information Management Suite’s component helps to Monitor CPU usage easily and we will learn how to use the thread TPerfMonThread in this post.
Platforms: Windows.
Installation Steps:
You can easily install this Component Suite from GetIt Package Manager. The steps are as follows.
Navigate In RAD Studio IDE->Tools->GetIt Package Manager->select Components in Categories->Components->Trail -MiTec system Information Component Suite 14.3 and click Install Button.
Read the license and Click Agree All. An Information dialog saying ‘Requires a restart of RAD studio at the end of the process. Do you want to proceed? click yes and continue.
It will download the plugin and installs it. Once installed Click Restart now.
How to run the Demo app:
Navigate to the System Information Management Suite trails setup, Demos folder which is installed during Get It installation e.g) C:UsersDocumentsEmbarcaderoStudio21.0CatalogRepositoryMiTeC-14.3DemosDelphi21
Open the CPUUsage project in RAD studio 10.4.1 compile and Run the application.
This Demo App shows how to monitor the Performance of CPU in your machine and show the performance by progress bar.
An instance FPM of TPerfMonThread is created. An efficient way to determine CPU usage is to use the ‘Processor:% Processor Time’ counter in System Monitor. This counter monitors the amount of time the CPU spends executing a thread that is not idle. Using the GetCounterInstances by providing counter path and string list.
For each cores created a label mentioning Core number and a TGauge to represent the performance.
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
lbl: TLabel;
g: TGauge;
begin
sl:=TStringList.Create;
FPM:=TPerfMonThread.Create;
cPC:=cPC1;
FPM.GetCounterInstances(cPC,sl);
if sl.Count=0 then begin
cPC:=cPC2;
FPM.GetCounterInstances(cPC,sl);
end;
FPM.OnInterval:=PerfMonThreadInterval;
FPM.AddCounter(cPC);
for i:=0 to sl.Count-1 do begin
lbl:=TLabel.Create(Self);
with lbl do begin
Parent:=Self;
if SameText(sl[i],'_Total') then
Caption:='Total'
else
Caption:='Core '+sl[i];
Top:=(Height+8)*i+10;
Left:=10;
end;
g:=TGauge.Create(Self);
g.Name:=Format('Gauge%d',[i]);
g.Parent:=Self;
g.Top:=lbl.Top;
g.Left:=90;
g.Height:=lbl.Height+2;
g.Width:=Self.ClientWidth-g.Left-10;
if SameText(sl[i],'_Total') then
g.ForeColor:=$000EC9FF
else if Pos(',_Total',sl[i])>0 then
g.ForeColor:=$0000DDDD
else
g.ForeColor:=$0031D329;
end;
if sl.Count=0 then
lWarn.Show
else begin
Self.ClientHeight:=lbl.Top+lbl.Height*2;
FPM.Suspended:=False;
end;
Update;
end;
On each interval, the progress of the Gauge is updated by ReadCounter property.
procedure TForm1.PerfMonThreadInterval(Sender: TPerfMonThread);
var
i: Integer;
g: TGauge;
begin
for i:=0 to sl.Count-1 do begin
g:=TGauge(FindComponent(Format('Gauge%d',[i])));
if Assigned(g) then
g.Progress:=Round(Sender.ReadCounter(FastStringReplace(cPC,'*',sl[i])));
end;
end;
MiTeC CPU Usage Demo
It’s that simple to monitor CPU usage in your machine and view the performance of the CPU cores. Use this MiTeC component suite and get the job done with less code.
Mon Feb 08 2021 07:49:01 GMT+0700 (Western Indonesia Time)
NexusDB is one of the loved database systems by Delphi developers around the world. It offers the Embedded free version which is a single-user database that compiles without any additional libraries. Delphi itself ships with the powerful FireDAC data access components library which features support for IBLite, SQLite, and over 20 other databases. According to the developer’s site “NexusDB introduces unique new features for Delphi developers while further improving on its core strengths stability, performance and flexibility.”
Moreover, NexusDB offers highly optimized database components to fit your database needs. With these components, you can easily manipulate and work with your database.
Mon Feb 08 2021 02:46:04 GMT+0700 (Western Indonesia Time)
Most of the utility programs utilize some kind of DOS programs like batch files for configuring some settings. If you ever wanted to run DOS programs from your main application and get the output to show in a memo or a list box this DOSCommand component lets you do that easily.
TurboPack DOSCommand component is open-source and free to utilize in Delphi and C++ Builder Win32-Win64 environments. It includes design-time and runtime packages. DOSCommand component can also send inputs to DOS programs, and you can get the output line by line. This means you do not have to wait until the end of the DOS programs to get a result.
Head over and check out the TurboPack DOSCommand component on the GetIt portal and download it from the IDE!
Sun Feb 07 2021 23:44:32 GMT+0700 (Western Indonesia Time)
LED scroller is the application that help you make text & emoji scroll on the screen easily and conveniently and it has been developed in Delphi. This app has many features and totally free for all users. With LED scroller, you can: Enter any text and emoji with any fonts (this app uses the default font of device). Custom text and emoji size and color. A user can use LED Scroller to create interested banners and messages. This is another great example of a powerful app yet uncomplicated app for Android that is built in Delphi. Apps like this are where productivity in Delphi FireMonkey for cross-platform development shines.
Sun Feb 07 2021 23:34:51 GMT+0700 (Western Indonesia Time)
ERP Sirius +Mobile is a generation business tool for small, medium and enterprise size businesses and it is developed with Delphi. According to the developer “there is a need for the business stakeholders to be on top of every aspect of their business so that they can act, appropriately and rapidly. Many businesses are disadvantaged from using existing tech solutions. They are complicated, hard to get trained on, difficult use, expensive to license and expensive to support as the business grows. Businesses have to invest in complementary software and hardware solutions to achieve true business-wide knowledge and accessibility. This means different interfaces, poor integration, additional training, multiple licenses etc. These complementary solutions dictate complex and inefficient business processes. ERP Sirius +Mobile enables your business to use a system of integrated modules to manage and integrate your company’s financials and operational processes. ERP Sirius +Mobile is cheaper than the competition software, a single piece of software that integrates all functions, can be easily scaled or customized to each customer to meet future requirements, is easy to use and easy to be trained on. The solution is fully internet-enabled, highly secure with cryptography, biometrics and can be hosted on a public or private cloud.”
Sun Feb 07 2021 23:22:38 GMT+0700 (Western Indonesia Time)
doogiePIM is a very unique Personal Data Safe in the layout of a fully operational web browser and personal information manager and it is developed with Delphi. It has built in sections for calendar, tasks, bookmarks, contacts, documents, vault, finance, spreadsheets, email, a brainstorming noteboard and custom resources. Of course, the built in web browser is based on a Chromium engine and works as a daily driver browser. All of this is fully encrypted into a single database file and is designed for designers, authors and other creative minds to keep their secrets local and to hand. The whole project took over fours year to get to its current version. According to the developer “the original idea of mine was formed back in 2003 (under the project name “do-organizer”)”. It features both a light and dark theme which is nice.
Sun Feb 07 2021 23:14:40 GMT+0700 (Western Indonesia Time)
MissMatch is a memory puzzle game for Android that is built with Delphi. As you will see in the screenshots it has a colorful interface and fun icons. The description in Google Play states “Are you looking for a fun and exciting photo puzzle game that makes language learning easier for kids and adults alike? The new photo memory puzzle is designed to help you make the most of your match puzzle experience. As one of the best tile matching games, this app helps the players to learn new words and identification easily and effectively.” The developer states “The new photo memory puzzle is designed to help you make the most of your match puzzle experience. This app helps the players to learn new words and identification easily and effectively.” As you can see not every project built in Delphi has to be super complex. Delphi makes it easy to built simple visual attractive apps and games.
Sun Feb 07 2021 18:00:07 GMT+0700 (Western Indonesia Time)
Optimization involves finding the inputs to an objective function that result in the minimum or maximum output of the function.
The open-source Python library for scientific computing called SciPy provides a suite of optimization algorithms. Many of the algorithms are used as a building block in other algorithms, most notably machine learning algorithms in the scikit-learn library.
These optimization algorithms can be used directly in a standalone manner to optimize a function. Most notably, algorithms for local search and algorithms for global search, the two main types of optimization you may encounter on a machine learning project.
In this tutorial, you will discover optimization algorithms provided by the SciPy library.
After completing this tutorial, you will know:
The SciPy library provides a suite of different optimization algorithms for different purposes.
The local search optimization algorithms available in SciPy.
The global search optimization algorithms available in SciPy.
Let’s get started.
Function Optimization With SciPy Photo by Manoel Lemos, some rights reserved.
Tutorial Overview
This tutorial is divided into three parts; they are:
Optimization With SciPy
Local Search With SciPy
Global Search With SciPy
Optimization With SciPy
The Python SciPy open-source library for scientific computing provides a suite of optimization techniques.
Many of the algorithms are used as building blocks for other algorithms within the SciPy library, as well as machine learning libraries such as scikit-learn.
Before we review specific techniques, let’s look at the types of algorithms provided by the library.
They are:
Scalar Optimization: Optimization of a convex single variable function.
Local Search: Optimization of a unimodal multiple variable function.
Global Search: Optimization of a multimodal multiple variable function.
Least Squares: Solve linear and non-linear least squares problems.
Curve Fitting: Fit a curve to a data sample.
Root Finding: Find the root (input that gives an output of zero) of a function.
Linear Programming: Linear optimization subject to constraints.
All algorithms assume the objective function that is being optimized is a minimization function. If your function is maximizing, it can be converted to minimizing by adding a negative sign to values returned from your objective function.
In addition to the above list, the library also provides utility functions used by some of the algorithms, as well as the Rosenbrock test problem.
For a good overview of the capabilities of the SciPy library for optimization, see:
Now that we have a high-level idea of the types of optimization techniques supported by the library, let’s take a closer look at two groups of algorithms we are more likely to use in applied machine learning. They are local search and global search.
Local Search With SciPy
Local search, or local function optimization, refers to algorithms that seek the input to a function that results in the minimum or maximum output where the function or constrained region being searched is assumed to have a single optima, e.g. unimodal.
The function that is being optimized may or may not be convex, and may have one or more than one input variable.
A local search optimization may be applied directly to optimize a function if the function is believed or known to be unimodal; otherwise, the local search algorithm may be applied to fine-tune the result of a global search algorithm.
The minimize() function takes as input the name of the objective function that is being minimized and the initial point from which to start the search and returns an OptimizeResult that summarizes the success or failure of the search and the details of the solution if found.
...
# minimize an objective function
result = minimize(objective, point)
Additional information about the objective function can be provided if known, such as the bounds on the input variables, a function for computing the first derivative of the function (gradient or Jacobian matrix), a function for computing the second derivative of the function (Hessian matrix), and any constraints on the inputs.
Importantly, the function provides the “method” argument that allows the specific optimization used in the local search to be specified.
A suite of popular local search algorithms are available, such as:
The example below demonstrates how to solve a two-dimensional convex function using the L-BFGS-B local search algorithm.
# l-bfgs-b algorithm local optimization of a convex function
from scipy.optimize import minimize
from numpy.random import rand
# objective function
def objective(x):
return x[0]**2.0 + x[1]**2.0
# define range for input
r_min, r_max = -5.0, 5.0
# define the starting point as a random sample from the domain
pt = r_min + rand(2) * (r_max - r_min)
# perform the l-bfgs-b algorithm search
result = minimize(objective, pt, method='L-BFGS-B')
# summarize the result
print('Status : %s' % result['message'])
print('Total Evaluations: %d' % result['nfev'])
# evaluate solution
solution = result['x']
evaluation = objective(solution)
print('Solution: f(%s) = %.5f' % (solution, evaluation))
Running the example performs the optimization and reports the success or failure of the search, the number of function evaluations performed, and the input that resulted in the optima of the function.
Status : b'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'
Total Evaluations: 9
Solution: f([3.38059583e-07 3.70089258e-07]) = 0.00000
Now that we are familiar with using a local search algorithm with SciPy, let’s look at global search.
Global Search With SciPy
Global search or global function optimization refers to algorithms that seek the input to a function that results in the minimum or maximum output where the function or constrained region being searched is assumed to have multiple local optima, e.g. multimodal.
The function that is being optimized is typically nonlinear, nonconvex, and may have one or more than one input variable.
Global search algorithms are typically stochastic, meaning that they make use of randomness in the search process and may or may not manage a population of candidate solutions as part of the search.
The SciPy library provides a number of stochastic global optimization algorithms, each via different functions. They are:
The library also provides the shgo() function for sequence optimization and the brute() for grid search optimization.
Each algorithm returns an OptimizeResult object that summarizes the success or failure of the search and the details of the solution if found.
The example below demonstrates how to solve a two-dimensional multimodal function using simulated annealing.
# simulated annealing global optimization for a multimodal objective function
from scipy.optimize import dual_annealing
# objective function
def objective(v):
x, y = v
return (x**2 + y - 11)**2 + (x + y**2 -7)**2
# define range for input
r_min, r_max = -5.0, 5.0
# define the bounds on the search
bounds = [[r_min, r_max], [r_min, r_max]]
# perform the simulated annealing search
result = dual_annealing(objective, bounds)
# summarize the result
print('Status : %s' % result['message'])
print('Total Evaluations: %d' % result['nfev'])
# evaluate solution
solution = result['x']
evaluation = objective(solution)
print('Solution: f(%s) = %.5f' % (solution, evaluation))
Running the example performs the optimization and reports the success or failure of the search, the number of function evaluations performed, and the input that resulted in the optima of the function.
Status : ['Maximum number of iteration reached']
Total Evaluations: 4028
Solution: f([-3.77931027 -3.283186 ]) = 0.00000
Further Reading
This section provides more resources on the topic if you are looking to go deeper.
You can find Delphi code samples in GitHub Repositories. Search by name into the samples repositories according to your RAD Studio version.
How to Use the Sample
To use this sample project
Run the migrate.bat utility.
Create the new FireDAC connection definition.
Add some additional components to your application form.
Set up the FireDAC connection parameters.
Run this demo application.
The following sections detail the steps of this procedure.
Run Migrate.bat Utility
The migrate.bat utility is located in the C:UsersPublicDocumentsEmbarcaderoStudio21.0SamplesObject PascalDatabaseFireDACToolreFindDBX2FDMigrationDemo folder.
The migrate.bat utility creates a new subdirectory FireDAC_MeetingOrg under Forms, and copies the source files of your dbExpress application to the FireDAC_MeetingOrg folder. It keeps the original source files.
The utility runs the RAD Studio reFind tool in order to replace the dbExpress terms of the application with their FireDAC counterparts.
You can find the “reFind.exe” utility in “C:Program Files (x86)EmbarcaderoStudio21.0binreFind.exe“.
To run Migrate.bat:
Go to C:UsersPublicDocumentsEmbarcaderoStudio21.0SamplesObject PascalDatabaseFireDACToolreFindDBX2FDMigrationDemo folder.
Double-click the migration.bat application to start the migration process.
Creating the new FireDAC Connection Definition
Open the project MeetingOrganizer.dproj located at C:UsersPublicDocumentsEmbarcaderoStudio21.0SamplesObject PascalDatabaseFireDACToolreFindDBX2FDMigrationDemoFormsFireDAC_MeetingOrg
Sat Feb 06 2021 15:29:02 GMT+0700 (Western Indonesia Time)
MetroDrummer is a powerful drum machine app for Android and iOS and it is built in Delphi. It features “12 Sections of rhythms with possibility to upload up to 24 rhythms for each section” and a “User section where to store your favorite rhythms with tempo change and mute drum parts” plus you can “Select any tempo from 40 (largo) to 300 beats per minute (prestissimo) as a real metronome.” It also features rhythm functions such as Start/Stop, Intro, Standard, Variation, Fill to Standard, Fill to Variation, Percussion, and Ending. Plus you can “Select any tempo from 40 (largo) to 300 beats per minute (prestissimo) as a real metronome.” Overall MetroDrummer is a powerful example of Delphi’s cross-platform capabilities.
Sat Feb 06 2021 15:07:02 GMT+0700 (Western Indonesia Time)
Escape sequences allow for writing DBMS-independent SQL commands. The sample predefines some escape function sequences. To execute a predefined escape function, right-click the Function edit box and choose a predefined escape function from the popup menu. Moreover, the sample allows you to write your own function. To this end, write text into the Function edit box and press Enter. Then, the sample uses the Prepare, Define, Open and Fetch methods of the IFDPhysCommand interface to process the escape function command text. Note: Go to the following page to see the syntax of the escape function sequences.
Location
You can find the EscapeFunctions sample project at:
Start | Programs | Embarcadero RAD Studio Sydney | Samples and then navigate to:
You can find Delphi code samples in GitHub Repositories. Search by name into the samples repositories according to your RAD Studio version.
How to Use the Sample
Navigate to the location given above and open EscapeFunctionsdproj.
Press F9 or choose Run > Run.
Interact with the sample:
Right-click the Function edit box and select a predefined escape function sequence.
Write your own escape function and press Enter.
Files
File in Delphi
Contains
EscapeFunctions.dproj EscapeFunctions.dpr
The project itself.
fEscapeFunctions.pas fEscapeFunctions.fmx
The main form.
Implementation
To preset the escape function sequences, the sample configures the following components at design time using the Object Inspector:
A TPopupMenu object named pmnFunc.The sample sets the Items property of this object with a menu of several predefined escape function sequences.
A TLabeledEdit object labeled as Function.The sample sets the PopupMenu property of the component to pmnFunc at design time. This setup allows you to choose a predefined escape function sequence in run time. To this end, right-click inside the edit box to see the popup menu. Then, choose a predefined escape function from the menu.
Moreover, when you run the application, you can interact with the sample using the following objects:
A TComboBox object labeled as Use Connection Definition.Click the Use Connection Definition combo box and select an option in order to define a connection to a database. The menu shows all the persistent connections defined on the file C:UsersPublicDocumentsEmbarcaderoStudioFireDACFDConnectionDefs.ini. When the connection is defined, the sample uses the CreateCommand method of IFDPhysConnection to create a command interface. Then, the sample enables the edit boxes labeled as: Function, SQL string and Result.
A TLabeledEdit object labeled as Function.The sample uses this object to let you choose/write an escape function sequence:
To choose a predefined escape function, right-click inside the edit box to see the popup menu. Then, choose a predefined escape function.
To write an escape function, type your own command text inside the edit box and press Enter.
When you chose/write the escape function, the sample uses the Prepare, Define, Open and Fetch methods of the IFDPhysCommand interface to process the scape function command text.
A TLabeledEdit object labeled as SQL string.The sample uses this edit box to show the SELECT command text that is executed. The Command text is the following: 'select distinct {fn %s} from {id test_free}', where %s corresponds to the escape function selected/written in the Function edit box.
A TLabeledEdit object labeled as Result.The sample uses this edit box to show the result of the escape function execution.
In the link below you will redirected to the original post of Embarcadero:
Fri Feb 05 2021 21:28:15 GMT+0700 (Western Indonesia Time)
As application developers, when there is a problem in our code we use tools to discover where those problem lies. Just like in code, when there is a problem with the database, we need to use specific tools that monitor and tune our databases.
When you are looking at tools for monitoring database performance, there are a few points that you want the tool to have:
Metrics relating to CPU and memory usage
Monitoring of queries and transactions
Logging
What InterBase Performance Monitor offers you
Embed. Deploy. Relax. A tagline I use often when it comes to InterBase. InterBase is one of those databases that doesn’t need a lot of hand holding and guidance once it is set up. With self-tuning and self-optimizing properties, it is the database that runs happily in it’s environment.
The Performance Monitor tool in InterBase is a utility that allows you to view detailed statistics about the current performance of the database, memory use, attached users, transactions, etc. or:
A summary of database threads, procedures, transactions and memory use.
Memory use by graph, pool or heap.
A list of all the tables and views in the database.
A list of all recent transactions.
A list of all recent procedures and triggers.
The interbase log file and statistics list.
Take a look at this in depth webinar on using Performance Monitor with InterBase to see how you can manage your database performance.
In conclusion, the use of a tool like Performance monitor gives you useful information about your servers and how each of your databases are doing, refreshing the data regularly, so you can keep up to date and relax. There is nothing to lose by monitoring your database performance, but a lot to gain.
Fri Feb 05 2021 20:24:49 GMT+0700 (Western Indonesia Time)
RadCORE is a base project using the power of Embarcadero Delphi and FMSoft’s uniGUI to accelerate the development of web applications. It applies exclusive Responsiveness and Layout features like Theme Control, Dynamic Alignment, etc. These are powered by the interpretation of pseudo-commands, defined at design-time or runtime.
RadCORE is constantly expanding and is already used in over 20 countries, helping to show the power of DELPHI + uniGUI for web development without the need to use TEMPLATES or requiring HTML / CSS / JS to create your screens.
Fri Feb 05 2021 19:43:01 GMT+0700 (Western Indonesia Time)
In the last few RAD Server posts, we have seen several industry templates that can be a headstart for your business. For instance, the Field Services Industry template and the Hospitality Industry template. Today, we will explore another complete and complex Nurses template.
RAD Server Nurses Demo – The connected nurses station showcases a common medical office scenario that has been augmented and fully digitized with the use of IoT and RAD Server. The sample project is designed to provide a good overview of RAD Server’s capabilities.
Be sure to learn about RAD Server. With RAD Server, you can achieve high productivity when it comes to large and complex services-based applications.
The Perfect Platform for Delphi and C++Builder Apps
Rapidly build and deploy services-based applications! RAD Server supports REST with JSON (or XML) parameter passing and return results. Publish APIs, manage connected users and devices, capture analytics about the use and users of applications, and connect to local and enterprise databases using FireDAC components. RAD Server also supports user authentication, push notifications, geolocation, and data storage.
Modernize. Migrate existing Delphi or C++ client/server business logic to a modern services-based architecture that is secure and scalable.
REST End Point Publishing, An all-in-one turnkey foundation for your application back end APIs and Services.
Integration Middleware, Integrations provide out of the box connectivity with external servers, applications and services.
Application Services, Ready-to-use built-in services including user directory services and user management, push notifications, user location tracking, and built-in data storage.
Easy-To-Deploy RAD Server is easy to develop, deploy and operate making it ideally suited for ISVs and OEMs building re-deployable solutions.
Delphi and C++Builder Support. RAD Server works out of the box with Delphi and C++Builder.
Fri Feb 05 2021 14:25:00 GMT+0700 (Western Indonesia Time)
Sometimes Developers want to list down or identify the process running in a machine programmatically. How to enumerate among the running processes and services quickly ? Don’t know how to do. Don’t worry. MiTec’s System Information Management Suite’s component helps to do that effectively and we will learn how to use the threads TSysProcMonThread and TSvcListMonThread to demonstrate the processes and services respectively.
Platforms: Windows.
Installation Steps:
You can easily install this Component Suite from GetIt Package Manager. The steps are as follows.
Navigate In RAD Studio IDE->Tools->GetIt Package Manager->select Components in Categories->Components->Trail -MiTec system Information Component Suite 14.3 and click Install Button.
Read the license and Click Agree All. An Information dialog saying ‘Requires a restart of RAD studio at the end of the process. Do you want to proceed? click yes and continue.
It will download the plugin and installs it. Once installed Click Restart now.
How to run the Demo app:
Navigate to the System Information Management Suite trails setup, Demos folder which is installed during Get It installation e.g) C:UsersDocumentsEmbarcaderoStudio21.0CatalogRepositoryMiTeC-14.3DemosDelphi6
Open the PV project in RAD studio 10.4.1 compile and Run the application.
This Demo App shows how to list down the running Process and Services in your machine, enumerate among them and access its properties.
Components used in MSIC PV Demo App:
TSysProcMonThread: Monitors system and provides running processes, CPU, memory and disk monitoring and provides system information.
TSvcListMonThread: Monitors installed services and drivers in real-time and provides their properties.
2 TTabsheet’s one for viewing Process list inTListView and other for viewing Services in TListView.
TButton to view the details of the process or service accordingly in a new child form.
Implementation Details:
An instance SPM of TSysProcMonThread and SLM of TSvcListMonThread were created. And in regular interval of each thread the Process list and service list is refreshed and updated to the screen using the OnInterval Event handlers
On each interval, the Process List( using TProcessRecord ) and Service List (using TServiceRecord) is added to the list view by clearing the existing list.
procedure Twnd_Main.RefreshProcList(Sender: TSysProcMonThread);
var
i: Integer;
r: TProcessRecord;
begin
PrcList.Items.BeginUpdate;
try
PrcList.Items.Clear;
for i:=0 to Sender.RecordCount-1 do begin
Sender.GetRecord(i,r);
with PrcList.Items.Add do begin
Caption:=r.Name;
if Is64 and (r.Platform<>64) then
Caption:=Caption+'*32';
SubItems.Add(Format('%d',[r.PID]));
SubItems.Add(FormatTicks(r.UserTime+r.KernelTime,False));
SubItems.Add(Format('%d KB',[r.VMCounters.WorkingSetSize div 1024]));
SubItems.Add(Format('%s',[r.CommandLine]));
end;
end;
if PrcList.Tag<>0 then
PrcList.AlphaSort;
finally
PrcList.Items.EndUpdate;
end;
end;
procedure Twnd_Main.RefreshSvcList(Sender: TSvcListMonThread);
var
i: Integer;
r: TServiceRecord;
begin
SvcList.Items.BeginUpdate;
try
SvcList.Items.Clear;
for i:=0 to Sender.RecordCount-1 do begin
Sender.GetRecord(i,r);
with SvcList.Items.Add do begin
Caption:=r.DisplayName;
if r.Typ=svcUnknown then
SubItems.Add(Format('%s (%d)',[cSvcType[r.Typ],r._Typ]))
else
SubItems.Add(cSvcType[r.Typ]);
SubItems.Add(cSvcStatus[r.Status]);
SubItems.Add(cSvcStartup[r.StartUp]);
SubItems.Add(r.ObjectName);
SubItems.Add(r.Name);
end;
end;
if SvcList.Tag<>0 then
SvcList.AlphaSort;
finally
SvcList.Items.EndUpdate;
end;
end;
Upon Clicking Details for the selected process in the list a new child form is created and data is added to different tab sheets.
procedure Tdlg_PrcDetails.RefreshData;
var
i,j,c: Integer;
r,n: TTreeNode;
VersionInfo: TVersionInfo;
m: TModuleRecord;
h: THandleRecord;
t: TThreadRecord;
w: TWindowRecord;
begin
eName.Text:=FRecord.Name;
imgIcon.Picture.Icon.Handle:=GetFileIcon(FRecord.ImageName);
GetFileVerInfo(FRecord.ImageName,VersionInfo);
GenList.Items.Clear;
with GenList.Items.Add do begin
Caption:='Description';
SubItems.Add(VersionInfo.Description);
ImageIndex:=-3;
end;
with GenList.Items.Add do begin
Caption:='Version';
SubItems.Add(VersionInfo.FileVersion);
end;
with GenList.Items.Add do begin
Caption:='Product Name';
SubItems.Add(VersionInfo.ProductName);
end;
with GenList.Items.Add do begin
Caption:='Company Name';
SubItems.Add(VersionInfo.CompanyName);
end;
with GenList.Items.Add do begin
Caption:='';
ImageIndex:=-2;
end;
with GenList.Items.Add do begin
Caption:='PID';
SubItems.Add(Format('%d',[FRecord.PID]));
ImageIndex:=-3;
end;
with GenList.Items.Add do begin
Caption:='Parent PID';
SubItems.Add(Format('%d',[FRecord.ParentPID]))
end;
with GenList.Items.Add do begin
Caption:='Image name';
SubItems.Add(FRecord.ImageName);
end;
with GenList.Items.Add do begin
Caption:='Command line';
SubItems.Add(FRecord.CommandLine);
end;
with GenList.Items.Add do begin
Caption:='';
ImageIndex:=-2;
end;
if Win32Platform=VER_PLATFORM_WIN32_NT then
with GenList.Items.Add do begin
Caption:='User Name';
SubItems.Add(FRecord.UserName);
ImageIndex:=-3;
end;
with GenList.Items.Add do begin
Caption:='Priority';
SubItems.Add(Format('%d',[FRecord.Priority]));
ImageIndex:=-3;
end;
with GenList.Items.Add do begin
Caption:='Thread Count';
SubItems.Add(Format('%d',[FRecord.ThreadCount]));
end;
with GenList.Items.Add do begin
Caption:='Handle Count';
SubItems.Add(Format('%d',[FRecord.HandleCount]));
end;
c:=FML.Count;
TabSheet2.Caption:=Format(' Modules (%d) ',[c]);
ModList.Items.Clear;
for i:=0 to c-1 do begin
m:=PModuleRecord(FML[i])^;
with ModList.Items.Add do begin
Caption:=m.Name;
SubItems.Add(Format('%d',[m.ImageSize]));
SubItems.Add(Format('0x%x',[m.BaseAddress]));
SubItems.Add(m.VersionInfo.Description);
end;
end;
c:=FTL.Count;
TabSheet5.Caption:=Format(' Threads (%d) ',[c]);
ThdList.Items.Clear;
for i:=0 to c-1 do begin
t:=PThreadRecord(FTL[i])^;
with ThdList.Items.Add do begin
Caption:=Format('%d',[t.ID]);
Subitems.Add(Format('0x%x',[t.StartAddress]));
Subitems.Add(Format('%d',[t.BasePriority]));
Subitems.Add(Format('%d',[t.Priority]));
if TThreadState(t.State)<>StateWait then
SubItems.Add(cThreadState[TThreadState(t.State)])
else
SubItems.Add(Format('%s:%s',[cThreadState[TThreadState(t.State)],cKWaitReason[TKWaitReason(t.WaitReason)]]));
Subitems.Add(Format('%d',[t.ContextSwitchCount]));
SubItems.Add(FormatTicks(t.KernelTime));
SubItems.Add(FormatTicks(t.UserTime));
end;
end;
TabSheet3.Caption:=Format(' Child Procs (%d) ',[FCP.Count]);
CPList.Items.Clear;
for i:=0 to FCP.Count-1 do
with CPList.Items.Add do begin
Caption:=FCP.Names[i];
SubItems.Add(FCP.ValueFromIndex[i]);
end;
CntList.Items.Clear;
with CntList.Items.Add do begin
Caption:='CPU Times';
ImageIndex:=-3;
end;
with CntList.Items.Add do begin
Caption:='Kernel Time';
SubItems.Add(FormatTicks(FRecord.KernelTime));
SubItems.Add('-');
end;
with CntList.Items.Add do begin
Caption:='User Time';
SubItems.Add(FormatTicks(FRecord.UserTime));
SubItems.Add('-');
end;
with CntList.Items.Add do begin
Caption:='Total Time';
SubItems.Add(FormatTicks(FRecord.UserTime+FRecord.KernelTime));
SubItems.Add('-');
end;
with CntList.Items.Add do begin
Caption:='';
ImageIndex:=-2;
end;
with CntList.Items.Add do begin
Caption:='I/O Counters';
ImageIndex:=-3;
end;
with CntList.Items.Add do begin
Caption:='Read Operation Count';
SubItems.Add(Format('%d',[FRecord.IOCounters.ReadOperationCount.QuadPart]));
SubItems.Add('-');
end;
with CntList.Items.Add do begin
Caption:='Write Operation Count';
SubItems.Add(Format('%d',[FRecord.IOCounters.WriteOperationCount.QuadPart]));
SubItems.Add('-');
end;
with CntList.Items.Add do begin
Caption:='Other Operation Count';
SubItems.Add(Format('%d',[FRecord.IOCounters.OtherOperationCount.QuadPart]));
SubItems.Add('-');
end;
with CntList.Items.Add do begin
Caption:='Read Transfer Count';
SubItems.Add(Format('%d',[FRecord.IOCounters.ReadTransferCount.QuadPart]));
SubItems.Add('-');
end;
with CntList.Items.Add do begin
Caption:='Write Transfer Count';
SubItems.Add(Format('%d',[FRecord.IOCounters.WriteTransferCount.QuadPart]));
SubItems.Add('-');
end;
with CntList.Items.Add do begin
Caption:='Other Transfer Count';
SubItems.Add(Format('%d',[FRecord.IOCounters.OtherTransferCount.QuadPart]));
SubItems.Add('-');
end;
with CntList.Items.Add do begin
Caption:='';
ImageIndex:=-2;
end;
with CntList.Items.Add do begin
Caption:='Virtual Memory Counters';
ImageIndex:=-3;
end;
with CntList.Items.Add do begin
Caption:='Page Fault Count';
SubItems.Add(Format('%d',[FRecord.VMCounters.PageFaultCount]));
SubItems.Add('-');
end;
with CntList.Items.Add do begin
Caption:='Virtual Size';
SubItems.Add(Format('%d B',[FRecord.VMCounters.VirtualSize]));
SubItems.Add(Format('%d B',[FRecord.VMCounters.PeakVirtualSize]));
end;
with CntList.Items.Add do begin
Caption:='Working Set Size';
SubItems.Add(Format('%d B',[FRecord.VMCounters.WorkingSetSize]));
SubItems.Add(Format('%d B',[FRecord.VMCounters.PeakWorkingSetSize]));
end;
with CntList.Items.Add do begin
Caption:='Quota Peak Paged Pool Usage';
SubItems.Add(Format('%d B',[FRecord.VMCounters.QuotaPagedPoolUsage]));
SubItems.Add(Format('%d B',[FRecord.VMCounters.QuotaPeakPagedPoolUsage]));
end;
with CntList.Items.Add do begin
Caption:='Quota Peak Non Paged Pool Usage';
SubItems.Add(Format('%d B',[FRecord.VMCounters.QuotaNonPagedPoolUsage]));
SubItems.Add(Format('%d B',[FRecord.VMCounters.QuotaPeakNonPagedPoolUsage]));
end;
with CntList.Items.Add do begin
Caption:='Pagefile Usage';
SubItems.Add(Format('%d B',[FRecord.VMCounters.PagefileUsage]));
SubItems.Add(Format('%d B',[FRecord.VMCounters.PeakPagefileUsage]));
end;
SecList.Items.Clear;
with SecList.Items.Add do begin
Caption:='Groups';
ImageIndex:=-3;
end;
for i:=0 to High(FRecord.Groups) do
with SecList.Items.Add do begin
if FRecord.Groups[i].Name='' then
Caption:=FRecord.Groups[i].SID
else
if FRecord.Groups[i].Domain<>'' then
Caption:=Format('%s%s',[FRecord.Groups[i].Domain,FRecord.Groups[i].Name])
else
Caption:=FRecord.Groups[i].Name;
SubItems.Add(Format('0x%x',[FRecord.Groups[i].Flags]));
end;
with SecList.Items.Add do begin
Caption:='';
ImageIndex:=-2;
end;
with SecList.Items.Add do begin
Caption:='Privileges';
ImageIndex:=-3;
end;
for i:=0 to High(FRecord.Privileges) do
with SecList.Items.Add do begin
Caption:=FRecord.Privileges[i].Name;
SubItems.Add(IntToStr(Integer(FRecord.Privileges[i].Flags and SE_PRIVILEGE_ENABLED=SE_PRIVILEGE_ENABLED)));
ImageIndex:=-4;
end;
c:=FHL.Count;
TabSheet6.Caption:=Format(' Handles (%d) ',[c]);
HList.Items.Clear;
for i:=0 to c-1 do begin
h:=PHandleRecord(FHL[i])^;
with HList.Items.Add do begin
Caption:=Format('0x%x',[h.Handle]);
SubItems.Add(h.TypeName);
SubItems.Add(Format('0x%x',[h.Access]));
SubItems.Add(h.Name);
end;
end;
r:=nil;
c:=FWL.Count;
TabSheet7.Caption:=Format(' Windows (%d) ',[c]);
WinTree.Items.Clear;
for i:=0 to c-1 do begin
w:=PWindowRecord(FWL[i])^;
for j:=0 to WinTree.Items.Count-1 do
if PHandle(WinTree.Items[j].Data)^=w.ParentWin then begin
r:=WinTree.Items[j];
Break;
end;
n:=WinTree.Items.AddChild(r,Format('(0x%x) "%s": %s',[w.Handle,w.Text,w.ClassName]));
n.ImageIndex:=Integer(w.Visible);
n.Data:=Allocmem(SizeOf(THandle));
n.SelectedIndex:=n.ImageIndex;
PHandle(n.Data)^:=w.Handle;
end;
if WinTree.Items.Count>0 then begin
WinTree.FullExpand;
WinTree.Items[0].MakeVisible;
end;
EnvBox.Items.Text:=FRecord.Environment;
tsEnv.Caption:=Format('Environment (%d)',[EnvBox.Items.Count]);
end;
MiTeC PV -Process Details Demo
Upon Clicking Details for the selected Service in the list a new child form is created and data is added to different tab sheets.
procedure Tdlg_SvcDetails.RefreshData;
var
i: Integer;
n: TTreeNode;
r: TServiceRecord;
begin
eName.Text:=FRecord.DisplayName;
GenList.Items.Clear;
imgIcon.Picture.Icon.Handle:=GetFileIcon(FRecord.ImageName);
GenList.Items.Clear;
with GenList.Items.Add do begin
Caption:='Description';
SubItems.Add(FRecord.VersionInfo.Description);
ImageIndex:=-3;
end;
with GenList.Items.Add do begin
Caption:='Version';
SubItems.Add(FRecord.VersionInfo.FileVersion);
end;
with GenList.Items.Add do begin
Caption:='Product Name';
SubItems.Add(FRecord.VersionInfo.ProductName);
end;
with GenList.Items.Add do begin
Caption:='Company Name';
SubItems.Add(FRecord.VersionInfo.CompanyName);
end;
with GenList.Items.Add do begin
Caption:='';
ImageIndex:=-2;
end;
with GenList.Items.Add do begin
Caption:='Service Name';
SubItems.Add(FRecord.Name);
ImageIndex:=-3;
end;
with GenList.Items.Add do begin
Caption:='Command line';
SubItems.Add(FRecord.CmdLine);
end;
with GenList.Items.Add do begin
Caption:='Log On As ';
SubItems.Add(FRecord.ObjectName);
end;
with GenList.Items.Add do begin
Caption:='Load Order Group';
SubItems.Add(FRecord.Group);
end;
with GenList.Items.Add do begin
Caption:='Type';
SubItems.Add(cSvcType[FRecord.Typ]);
end;
with GenList.Items.Add do begin
Caption:='';
ImageIndex:=-2;
end;
with GenList.Items.Add do begin
Caption:='Status';
SubItems.Add(cSvcStatus[FRecord.Status]);
ImageIndex:=-3;
end;
with GenList.Items.Add do begin
Caption:='Startup Mode';
SubItems.Add(cSvcStartup[FRecord.Startup]);
end;
with GenList.Items.Add do begin
Caption:='Error Control';
SubItems.Add(cSvcErrorControl[FRecord.ErrCtrl]);
end;
Dep1Tree.Items.Clear;
sl.CommaText:=FRecord.DependOnService;
for i:=0 to sl.Count-1 do begin
SLM.GetRecordByName(sl[i],r);
if r.Name<>'' then begin
n:=Dep1Tree.Items.AddChild(nil,r.DisplayName);
n.ImageIndex:=0;
n.HasChildren:=True;
end;
end;
Dep1Tree.AlphaSort;
Dep2Tree.Items.Clear;
SLM.GetServiceDependants(FRecord.Name,sl);
for i:=0 to sl.Count-1 do begin
n:=Dep2Tree.Items.AddChild(nil,sl.ValueFromIndex[i]);
n.ImageIndex:=0;
n.HasChildren:=True;
end;
Dep2Tree.AlphaSort;
end;
MiTeC PV -Services Details Demo
Apart from these stopping , starting, pause and resuming the services were implemented in the sample.
It’s that simple to enumerate Process List and Service List running in your machine and view the details of the process. Use this MiTeC component suite and get the job done quickly.
Fri Feb 05 2021 13:36:02 GMT+0700 (Western Indonesia Time)
One of the best and popular barcode scanning library for Delphi is ZXing.Delphi library. ZXing Barcode Scanning Object Pascal library for Delphi VCL and Delphi Firemonkey.
ZXing.Delphi is a native Object Pascal library that is based on the well known open source Barcode Library: ZXing (Zebra Crossing). This port is based on the .Net Redth port of ZXing and the Java one. It is aimed at all of the FireMonkey mobile platforms and, starting from v3.1, it fully supports also Windows VCL applications (no dependencies on FMX.Graphics unit).
With this library, you can scan with native speed without the use of linking in external libraries and avoid compatibility issues and dependencies. It is fast.
procedure TmainFrm.btnLoadFromFileClick(Sender: TObject);
var ReadResult: TReadResult;
ScanManager: TScanManager;
bmp:VCL.Graphics.TBitmap; // just to be sure we are really using VCL bitmaps
begin
if not OpenDlg.Execute then exit;
image.Picture.LoadFromFile(openDlg.FileName);
ReadResult := nil;
ScanManager := nil;
bmp := nil;
try
bmp:= TBitmap.Create;
bmp.assign (image.Picture.Graphic);
ScanManager := TScanManager.Create(TBarcodeFormat.Auto, nil);
ReadResult := ScanManager.Scan(bmp);
if ReadResult<>nil then
log.Lines.Text := ReadResult.text
else
log.Lines.Text := 'Unreadable!';
finally
bmp.Free;
ScanManager.Free;
ReadResult.Free;
end;
end;
Features
Natively compiled barcode scanning for all VCL and FireMonkey platforms (IOS/Android/Windows/OSX).
Fri Feb 05 2021 13:11:00 GMT+0700 (Western Indonesia Time)
Delphi and C++ Builder VCL community is so big that you can find a various set of libraries, functions and non-visual classes which can be instantly reused by developers.
One of the popular libraries is the JEDI Code Library (JCL) – The library is built upon code donated from the JEDI community. It is fully documented and fully tested. The library is grouped into several categories such as Strings, Files, Security, Math, IO, and many more.
JEDI Code Library is available on the GetIt package manager. And it is easy to download and install to your RAD Studio.
uses
JclFileUtils, JclStrings, JclSysUtils;
{ TForm1 }
procedure TForm1.FileListBox1Change(Sender: TObject);
var
FileName: TFileName;
I: Integer;
begin
FileName := FileListBox1.FileName;
Memo1.Lines.BeginUpdate;
try
Memo1.Lines.Clear;
if VersionResourceAvailable(FileName) then
with TJclFileVersionInfo.Create(FileName) do
try
for I := 0 to LanguageCount - 1 do
begin
LanguageIndex := I;
Memo1.Lines.Add(Format('[%s] %s', [LanguageIds[I], LanguageNames[I]]));
Memo1.Lines.Add(StringOfChar('-', 80));
Memo1.Lines.AddStrings(Items);
Memo1.Lines.Add(BinFileVersion);
Memo1.Lines.Add(OSIdentToString(FileOS));
Memo1.Lines.Add(OSFileTypeToString(FileType, FileSubType));
Memo1.Lines.Add('');
end;
Memo1.Lines.Add('Translations:');
for I := 0 to TranslationCount - 1 do
Memo1.Lines.Add(VersionLanguageId(Translations[I]));
Memo1.Lines.Add(BooleanToStr(TranslationMatchesLanguages));
finally
Free;
end;
finally
Memo1.Lines.EndUpdate;
end;
end;
Delphiは、1995年の登場以来、成長、成熟、拡大を続けてきました。1995年に作成したアプリケーションであっても、最小限の変更で現在のバージョンのDelphiに移植できるほど、下位互換性が維持されています。包括的なドキュメントがメンテナンスをサポートしており、製品のアップグレードや移行、トラブルシューティングには、サポートサービスを利用することができます。本記事執筆時点で、Delphiの最新バージョンは、2020年9月2日にリリースされたRAD Studio 10.4.1 Sydneyです。過去のリリースの詳細について知りたい場合は、過去のリリースノートを参照してください。
Fri Feb 05 2021 01:00:00 GMT+0700 (Western Indonesia Time)
Game Collectorは、強力なビデオゲームゲームコレクションデータベースソフトウェアであり、Delphiによって構築されています。開発者のWebサイトによれば、Game Collectorのメイン画面は高度にカスタマイズ可能であり、好きな表示に変更することができます。メイン画面フォルダ/リスト/詳細パネル、ゲームのリスト/イメージ/カードビュー、ゲーム詳細パネルのさまざまなテンプレートなどの複数のレイアウトから選択でき、すべての画面でライト/ダーク/システムスキンの選択が可能です。タイトルまたはバーコードを用いて簡単にゲームをデータベースに追加。コアオンラインゲームデータベースが、タイトル、プラットフォーム、説明、さらには、ジャンル、開発者、発行者、リリース日、カバーアート、バックドロップアート、トレーラービデオなど、ゲームの完全な詳細情報を自動的に提供します。この印象的なソフトウェアは、Delphiの持つパワーと汎用性を示す好例と言えます。
Thu Feb 04 2021 21:00:57 GMT+0700 (Western Indonesia Time)
Microsoft’s response to Solorigate
Since December, the United States, its government, and other critical institutions including security firms have been addressing the world’s latest serious nation-state cyberattack, sometimes referred to as ‘Solorigate’ or ‘SUNBURST.’ As we shared earlier this is a moment of reckoning for our industry and needs a unified response of defenders across public and private sectors. Microsoft is committed to protecting our customers and safeguarding our communities and we are proud to partner with industry partners to respond to this attack and strengthen our collective defenses. We believe transparency and clarity are important for strong cybersecurity and in that spirit, we are sharing information about some commonly asked questions. We look forward to serving and protecting our customers and communities.
Question: What has Microsoft’s role been in the Solorigate incident?
Answer:
As Brad Smith wrote on December 17, 2020, Solorigate is a moment of reckoning for security. We believe the Solorigate incident is an opportunity for the industry to work together to share information, strengthen defenses, and respond to attacks. We are proud to be part of the collaborative work being done to empower the defender community. Over the past two months, there have been several disclosures related to the Solorigate actor and Microsoft has had a unique perspective from several angles:
Helping investigate with FireEye.
Using indicators to find unusual activity and notifying customers and partners.
Helping with customer investigations.
Investigating our own environment.
In all of our investigations to date, data hosted in Microsoft services (including email) was sometimes a target in the incidents, but the attacker had gained privileged credentials in some other way.
Question: With your broad engagement, you’ve been criticized for not disclosing details as soon as you knew about them. How do you respond?
Answer:
We believe the Solorigate incident is an opportunity for the industry to work together to share information, strengthen defenses, and respond to attacks.
We have a very talented and experienced cybersecurity response team. In those situations where we provide investigative support to other organizations, we are restricted from sharing details. In these engagements, as well as when we notify organizations, those organizations have control in deciding what details they disclose and when they disclose them.
Additionally, investigations sometimes discover early indicators that require further research before they are actionable. Taking the time to thoroughly investigate incidents is necessary in order to provide the best guidance to the broader security community, our customers, and our partners.
We share actionable information regularly on our Solorigate resource center, and we are committed to providing additional updates if and when we discover new information to help inform and enable the community.
Question: The Cybersecurity & Infrastructure Security Agency (CISA) says other attack vectors have been discovered apart from SolarWinds. Has Microsoft in any way been an initial entry point for the Solorigate actor?
Answer:
No. In our investigations to date, data hosted in Microsoft services (including email) was sometimes a target in the incidents, but the attacker had gained privileged credentials in some other way.
From the beginning, we have said that we believe this is a sophisticated actor that has many tools in its toolkit, so it is not a surprise that a sophisticated actor would also use other methods to gain access to targets. In our investigations and through collaboration with our industry peers, we have confirmed several additional compromise techniques leveraged by the actor, including password spraying, spearphishing, use of webshell, through a web server, and delegated credentials.
As we learn more from our engagements, we will continue to improve our security products and share learnings with the community. For the most up-to-date information and guidance, please visit our resource center.
Question: What should we know about the Microsoft notifications to customers? Does that mean you detected a compromise in Microsoft services?
Answer:
No, it means our telemetry indicated unusual activity in authorized accounts.
As part of the investigative team working with FireEye, we were able to analyze the attacker’s behavior with a forensic investigation and identify unusual technical indicators that would not be associated with normal user interactions. We then used our telemetry to search for those indicators and identify organizations where credentials had likely been compromised by the Solorigate actor.
Microsoft directly notifies the affected customers to provide the indicators they need to investigate the observed behavior with their organizational knowledge and within their specific context.
Question: Some have interpreted the wording in the SolarWinds 8K to mean that they were made aware of or were investigating an attack vector related to Microsoft Office 365. Has that been investigated?
The 8K wording is, “SolarWinds uses Microsoft Office 365 for its email and office productivity tools. SolarWinds was made aware of an attack vector that was used to compromise the Company’s emails and may have provided access to other data contained in the Company’s office productivity tools.”
Answer:
We have investigated thoroughly and have found no evidence they were attacked via Office 365. The wording of the SolarWinds 8K filing was unfortunately ambiguous, leading to erroneous interpretation and speculation, which is not supported by the results of our investigation. SolarWinds has confirmed these findings in their blog on February 3, 2021.
Question: Reuters broke news on December 17, 2020, alleging that “Microsoft’s own products were then used to further the attacks” and saying it was not immediately clear “how many Microsoft users were affected by the tainted products.” Is that article accurate?
Answer:
No, it is not accurate. As we said at the time, and based upon all investigations since, we have found no indications that our systems were used to attack others. Data hosted in Microsoft services (including email) were sometimes a post-compromise target of attack, but only after an attacker had gained privileged credentials in some other way.
Question: Some companies say the hackers entered its systems via Microsoft products. Do you dispute this?
Answer:
We’ve investigated each situation as we became aware of it and in each case, data hosted in Microsoft services (including email) were a target in the incident, but the attacker had gained privileged credentials in another way.
Question: When did Microsoft know about being attacked by the Solorigate actor?
Answer:
Our security teams work continually to protect users, devices, and data from ongoing threats to our environment, but the investigations specifically focused on the Solorigate actor began when we became aware of the malicious SolarWinds applications.
Question: Given how serious Solorigate is, what can be done? What is the big takeaway?
Answer:
The cybersecurity industry has long been aware that sophisticated and well-funded actors were theoretically capable of advanced techniques, patience, and operating below the radar, but this incident has proven that it isn’t just theoretical.
We believe the Solorigate incident has proven the benefit of the industry working together to share information, strengthen defenses, and respond to attacks.
Additionally, the attacks have reinforced two key points that the industry has been advocating for a while now—defense-in-depth protections and embracing a zero trust mindset.
Defense-in-depth protections and best practices are really important because each layer of defense provides an extra opportunity to detect an attack and take action before they get closer to valuable assets. We saw this ourselves in our internal investigation, where we found evidence of attempted activities that were thwarted by defense-in-depth protections. So, we again want to reiterate the value of industry best practices such as outlined here, and implementing Privileged Access Workstations (PAW) as part of a strategy to protect privileged accounts.
A zero trust, “assume breach” philosophy is an important approach to defense. Many of the techniques we’ve observed are post-compromise techniques, so security companies and Microsoft are looking for ways to improve detections and provide protection even when an attacker gains unauthorized access.
In technical literature, the terms data discovery, classification, and tagging are sometimes used interchangeably, but there are real differences in what they actually mean—and each plays a critical role in an enterprise data protection strategy.
Data discovery is the process of reporting information about the sensitivity of a data object. The granularity of reporting typically includes what type of sensitive information is found, exactly where it is found, along with the exact cardinality of sensitive data elements. Data classification is the association of a label, which typically has some business value, to an object (file or a table). Classification is often stored as metadata in a separate system or an external data catalog and enables downstream usage of a data object based on security or privacy policies. Data tagging (labeling)is the application of an actual label (or classification) to the associated object.
The important thing to note here is that data discovery is always foundational to a data protection strategy. Classification and tagging depend on accurate discovery to drive the appropriate method of protection, which will ultimately depend on the consumption or utilization and privacy requirements for the data. The more comprehensive and efficient (automated and integrated) the data discovery, the more effective and cost-effective the data protection.
Dataguise and Microsoft Information Protection: Better together
Now, you probably know that Microsoft Information Protection is a comprehensive suite of services and features that Microsoft offers for its customers to classify, label, and protect data. Microsoft Information Protection forms the core of many enterprise data protection strategies.
Dataguise is a sensitive data discovery and protection software that now integrates with Microsoft Information Protection. More specifically, it performs context-aware discovery of structured, unstructured, and semi-structured data, and can use the results of that discovery to report on data classification, tag data with Microsoft Information Protection-readable labels, and protect sensitive data either natively—via innumerable methods of masking, encryption, and monitoring—or by integrating with Microsoft Information Protection or a third-party data protection solution. It’s a highly scalable solution that relies on machine learning and other heuristics to allow for efficient, accurate data discovery in multi-petabyte, hybrid environments.
With Dataguise, discovery can be done at several levels to meet various risk, compliance, or data governance goals; but there are two kinds of discovery that are of particular interest here, and it’s important to distinguish them:
Discovery of personal information and other sensitive data: This is the process of finding and reporting data governed by PII, PCI, PHI, and any similar policy, where all sensitive data needs to be discovered but not associated with an individual. Such requirements are typically driven by industry security standards or regulations.
Identity-based data discovery: This is the process of finding and reporting data specifically related to an individual. The contents of the report may or may not be useful for directly identifying the associated individual, but the entirety of a report constitutes the breadth of information that an enterprise possesses about the given data subject. Identity-based discovery is typically driven by recent data privacy laws like GDPR in the EU, CCPA in California, and LGPD in Brazil.
A data protection strategy that takes both types of discovery into account and incorporates technologies to perform them accurately, efficiently, and comprehensively—can add value not only for information security or privacy teams but for risk, compliance, governance, analytics, marketing, and IT operations teams as well. When you think of all the ways an organization collects, uses, shares, and stores data across the enterprise, more granular visibility leads to more precise control and, therefore, greater business flexibility and agility to maximize data value.
Ultimately, Dataguise complements Microsoft Information Protection capabilities, making the combination extremely useful for the customer.
The discovery synergy: Dataguise augments Microsoft Information Protection scanning capabilities
Dataguise’s real strength lies in the fact that it can discover and report sensitive and personal data across relational databases, NoSQL databases, Hadoop, file shares, cloud stores like ADLS, S3, and GCS, and over 200 different cloud-based applications. Therefore, Dataguise primarily can extend Microsoft Information Protection’s scanning coverage to structured and unstructured data stored outside Microsoft products to the ones mentioned above. This is a game-changer, as Microsoft Information Protection can now be used to tag all co-located sensitive and personal data on all co-located platforms.
The protection synergy: Dataguise enhances downstream data protection capabilities for Microsoft Information Protection
Dataguise uses Microsoft Information Protection’s SDK to seamlessly integrate discovery with Microsoft Information Protection’s tagging capability. Whether the tags power DLP, access control, or encryption and decryption solutions, Dataguise can either natively or by leveraging a third-party solution, team up with Microsoft Information Protection to create an end-to-end data protection strategy and automated implementation.
So how does this all work?
The integration is seamless and starts with defining the tags in Microsoft Information Protection. Then, there is a mapping of these tags to one or a combination of sensitive elements, out-of-the-box or custom in Dataguise. As Dataguise runs its discovery scans, it is using that mapping to report tags corresponding to each file that it has scanned. Now, using the Microsoft Information Protection SDK, these tags are applied to the corresponding file. Dataguise discovery uses context-aware discovery based on machine learning, which benefits Microsoft Information Protection by tagging files accurately and at scale. The figure below shows the flow:
Dataguise and Microsoft Information Protection bring a powerful combination of capabilities to any data protection strategy and implementation. The joint value of this integration lies in the fact that Dataguise can cover a broad range of platforms for discovery, and then leverage Microsoft Information Protection labeling to enable downstream data protection. Intelligent and context-aware data discovery is foundational to data protection, and with accurate optics, enterprise-wide implementation of comprehensive and automated data protection policies can be achieved.
To learn more about the Microsoft Intelligent Security Association (MISA), visit our website where you can learn about the MISA program, product integrations, and find MISA members. Visit the video playlist to learn about the strength of member integrations with Microsoft products.
For more information about Microsoft Security Solutions, visit the Microsoft Security website. Bookmark the Security blog to keep up with our expert coverage of security matters. Also, follow us at @MSFTSecurity for the latest news and updates on cybersecurity.
Thu Feb 04 2021 18:00:41 GMT+0700 (Western Indonesia Time)
Gradient descent is an optimization algorithm that follows the negative gradient of an objective function in order to locate the minimum of the function.
A problem with gradient descent is that it can bounce around the search space on optimization problems that have large amounts of curvature or noisy gradients, and it can get stuck in flat spots in the search space that have no gradient.
Momentum is an extension to the gradient descent optimization algorithm that allows the search to build inertia in a direction in the search space and overcome the oscillations of noisy gradients and coast across flat spots of the search space.
In this tutorial, you will discover the gradient descent with momentum algorithm.
After completing this tutorial, you will know:
Gradient descent is an optimization algorithm that uses the gradient of the objective function to navigate the search space.
Gradient descent can be accelerated by using momentum from past updates to the search position.
How to implement gradient descent optimization with momentum and develop an intuition for its behavior.
Let’s get started.
Gradient Descent With Momentum from Scratch Photo by Chris Barnes, some rights reserved.
Tutorial Overview
This tutorial is divided into three parts; they are:
Gradient Descent
Momentum
Gradient Descent With Momentum
One-Dimensional Test Problem
Gradient Descent Optimization
Visualization of Gradient Descent Optimization
Gradient Descent Optimization With Momentum
Visualization of Gradient Descent Optimization With Momentum
It is technically referred to as a first-order optimization algorithm as it explicitly makes use of the first-order derivative of the target objective function.
First-order methods rely on gradient information to help direct the search for a minimum …
The first-order derivative, or simply the “derivative,” is the rate of change or slope of the target function at a specific point, e.g. for a specific input.
If the target function takes multiple input variables, it is referred to as a multivariate function and the input variables can be thought of as a vector. In turn, the derivative of a multivariate target function may also be taken as a vector and is referred to generally as the “gradient.”
Gradient: First-order derivative for a multivariate objective function.
The derivative or the gradient points in the direction of the steepest ascent of the target function for a specific input.
Gradient descent refers to a minimization optimization algorithm that follows the negative of the gradient downhill of the target function to locate the minimum of the function.
The gradient descent algorithm requires a target function that is being optimized and the derivative function for the objective function. The target function f() returns a score for a given set of inputs, and the derivative function f'() gives the derivative of the target function for a given set of inputs.
The gradient descent algorithm requires a starting point (x) in the problem, such as a randomly selected point in the input space.
The derivative is then calculated and a step is taken in the input space that is expected to result in a downhill movement in the target function, assuming we are minimizing the target function.
A downhill movement is made by first calculating how far to move in the input space, calculated as the step size (called alpha or the learning rate) multiplied by the gradient. This is then subtracted from the current point, ensuring we move against the gradient, or down the target function.
x = x – step_size * f'(x)
The steeper the objective function at a given point, the larger the magnitude of the gradient and, in turn, the larger the step taken in the search space. The size of the step taken is scaled using a step size hyperparameter.
Step Size (alpha): Hyperparameter that controls how far to move in the search space against the gradient each iteration of the algorithm, also called the learning rate.
If the step size is too small, the movement in the search space will be small and the search will take a long time. If the step size is too large, the search may bounce around the search space and skip over the optima.
Now that we are familiar with the gradient descent optimization algorithm, let’s take a look at momentum.
Momentum
Momentum is an extension to the gradient descent optimization algorithm, often referred to as gradient descent with momentum.
It is designed to accelerate the optimization process, e.g. decrease the number of function evaluations required to reach the optima, or to improve the capability of the optimization algorithm, e.g. result in a better final result.
A problem with the gradient descent algorithm is that the progression of the search can bounce around the search space based on the gradient. For example, the search may progress downhill towards the minima, but during this progression, it may move in another direction, even uphill, depending on the gradient of specific points (sets of parameters) encountered during the search.
This can slow down the progress of the search, especially for those optimization problems where the broader trend or shape of the search space is more useful than specific gradients along the way.
One approach to this problem is to add history to the parameter update equation based on the gradient encountered in the previous updates.
This change is based on the metaphor of momentum from physics where acceleration in a direction can be accumulated from past updates.
The name momentum derives from a physical analogy, in which the negative gradient is a force moving a particle through parameter space, according to Newton’s laws of motion.
Momentum involves adding an additional hyperparameter that controls the amount of history (momentum) to include in the update equation, i.e. the step to a new point in the search space. The value for the hyperparameter is defined in the range 0.0 to 1.0 and often has a value close to 1.0, such as 0.8, 0.9, or 0.99. A momentum of 0.0 is the same as gradient descent without momentum.
First, let’s break the gradient descent update equation down into two parts: the calculation of the change to the position and the update of the old position to the new position.
The change in the parameters is calculated as the gradient for the point scaled by the step size.
change_x = step_size * f'(x)
The new position is calculated by simply subtracting the change from the current point
x = x – change_x
Momentum involves maintaining the change in the position and using it in the subsequent calculation of the change in position.
If we think of updates over time, then the update at the current iteration or time (t) will add the change used at the previous time (t-1) weighted by the momentum hyperparameter, as follows:
The update to the position is then performed as before.
x(t) = x(t-1) – change_x(t)
The change in the position accumulates magnitude and direction of changes over the iterations of the search, proportional to the size of the momentum hyperparameter.
For example, a large momentum (e.g. 0.9) will mean that the update is strongly influenced by the previous update, whereas a modest momentum (0.2) will mean very little influence.
The momentum algorithm accumulates an exponentially decaying moving average of past gradients and continues to move in their direction.
Momentum has the effect of dampening down the change in the gradient and, in turn, the step size with each new point in the search space.
Momentum can increase speed when the cost surface is highly nonspherical because it damps the size of the steps along directions of high curvature thus yielding a larger effective learning rate along the directions of low curvature.
Momentum is most useful in optimization problems where the objective function has a large amount of curvature (e.g. changes a lot), meaning that the gradient may change a lot over relatively small regions of the search space.
The method of momentum is designed to accelerate learning, especially in the face of high curvature, small but consistent gradients, or noisy gradients.
It is also helpful when the gradient is estimated, such as from a simulation, and may be noisy, e.g. when the gradient has a high variance.
Finally, momentum is helpful when the search space is flat or nearly flat, e.g. zero gradient. The momentum allows the search to progress in the same direction as before the flat spot and helpfully cross the flat region.
Now that we are familiar with what momentum is, let’s look at a worked example.
Gradient Descent with Momentum
In this section, we will first implement the gradient descent optimization algorithm, then update it to use momentum and compare results.
One-Dimensional Test Problem
First, let’s define an optimization function.
We will use a simple one-dimensional function that squares the input and defines the range of valid inputs from -1.0 to 1.0.
The objective() function below implements this function.
# objective function
def objective(x):
return x**2.0
We can then sample all inputs in the range and calculate the objective function value for each.
...
# define range for input
r_min, r_max = -1.0, 1.0
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max+0.1, 0.1)
# compute targets
results = objective(inputs)
Finally, we can create a line plot of the inputs (x-axis) versus the objective function values (y-axis) to get an intuition for the shape of the objective function that we will be searching.
...
# create a line plot of input vs result
pyplot.plot(inputs, results)
# show the plot
pyplot.show()
The example below ties this together and provides an example of plotting the one-dimensional test function.
# plot of simple function
from numpy import arange
from matplotlib import pyplot
# objective function
def objective(x):
return x**2.0
# define range for input
r_min, r_max = -1.0, 1.0
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max+0.1, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# show the plot
pyplot.show()
Running the example creates a line plot of the inputs to the function (x-axis) and the calculated output of the function (y-axis).
We can see the familiar U-shape called a parabola.
Line Plot of Simple One Dimensional Function
Gradient Descent Optimization
Next, we can apply the gradient descent algorithm to the problem.
First, we need a function that calculates the derivative for the objective function.
The derivative of x^2 is x * 2 and the derivative() function implements this below.
# derivative of objective function
def derivative(x):
return x * 2.0
We can define a function that implements the gradient descent optimization algorithm.
The procedure involves starting with a randomly selected point in the search space, then calculating the gradient, updating the position in the search space, evaluating the new position, and reporting the progress. This process is then repeated for a fixed number of iterations. The final point and its evaluation are then returned from the function.
The function gradient_descent() below implements this and takes the name of the objective and gradient functions as well as the bounds on the inputs to the objective function, number of iterations, and step size, then returns the solution and its evaluation at the end of the search.
# gradient descent algorithm
def gradient_descent(objective, derivative, bounds, n_iter, step_size):
# generate an initial point
solution = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])
# run the gradient descent
for i in range(n_iter):
# calculate gradient
gradient = derivative(solution)
# take a step
solution = solution - step_size * gradient
# evaluate candidate point
solution_eval = objective(solution)
# report progress
print('>%d f(%s) = %.5f' % (i, solution, solution_eval))
return [solution, solution_eval]
We can then define the bounds of the objective function, the step size, and the number of iterations for the algorithm.
We will use a step size of 0.1 and 30 iterations, both found after a little experimentation.
The seed for the pseudorandom number generator is fixed so that we always get the same sequence of random numbers, and in this case, it ensures that we get the same starting point for the search each time the code is run (e.g. something interesting far from the optima).
...
# seed the pseudo random number generator
seed(4)
# define range for input
bounds = asarray([[-1.0, 1.0]])
# define the total iterations
n_iter = 30
# define the maximum step size
step_size = 0.1
# perform the gradient descent search
best, score = gradient_descent(objective, derivative, bounds, n_iter, step_size)
Tying this together, the complete example of applying grid search to our one-dimensional test function is listed below.
# example of gradient descent for a one-dimensional function
from numpy import asarray
from numpy.random import rand
from numpy.random import seed
# objective function
def objective(x):
return x**2.0
# derivative of objective function
def derivative(x):
return x * 2.0
# gradient descent algorithm
def gradient_descent(objective, derivative, bounds, n_iter, step_size):
# generate an initial point
solution = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])
# run the gradient descent
for i in range(n_iter):
# calculate gradient
gradient = derivative(solution)
# take a step
solution = solution - step_size * gradient
# evaluate candidate point
solution_eval = objective(solution)
# report progress
print('>%d f(%s) = %.5f' % (i, solution, solution_eval))
return [solution, solution_eval]
# seed the pseudo random number generator
seed(4)
# define range for input
bounds = asarray([[-1.0, 1.0]])
# define the total iterations
n_iter = 30
# define the step size
step_size = 0.1
# perform the gradient descent search
best, score = gradient_descent(objective, derivative, bounds, n_iter, step_size)
print('Done!')
print('f(%s) = %f' % (best, score))
Running the example starts with a random point in the search space, then applies the gradient descent algorithm, reporting performance along the way.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the algorithm finds a good solution after about 27 iterations, with a function evaluation of about 0.0.
Note the optima for this function is at f(0.0) = 0.0.
We would expect that gradient descent with momentum will accelerate the optimization procedure and find a similarly evaluated solution in fewer iterations.
Next, we can visualize the progress of the search on a plot of the target function.
First, we can update the gradient_descent() function to store all solutions and their score found during the optimization as lists and return them at the end of the search instead of the best solution found.
# gradient descent algorithm
def gradient_descent(objective, derivative, bounds, n_iter, step_size):
# track all solutions
solutions, scores = list(), list()
# generate an initial point
solution = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])
# run the gradient descent
for i in range(n_iter):
# calculate gradient
gradient = derivative(solution)
# take a step
solution = solution - step_size * gradient
# evaluate candidate point
solution_eval = objective(solution)
# store solution
solutions.append(solution)
scores.append(solution_eval)
# report progress
print('>%d f(%s) = %.5f' % (i, solution, solution_eval))
return [solutions, scores]
The function can be called and we can get the lists of the solutions and the scores found during the search.
We can create a line plot of the objective function, as before.
...
# sample input range uniformly at 0.1 increments
inputs = arange(bounds[0,0], bounds[0,1]+0.1, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
Finally, we can plot each solution found as a red dot and connect the dots with a line so we can see how the search moved downhill.
...
# plot the solutions found
pyplot.plot(solutions, scores, '.-', color='red')
Tying this all together, the complete example of plotting the result of the gradient descent search on the one-dimensional test function is listed below.
# example of plotting a gradient descent search on a one-dimensional function
from numpy import asarray
from numpy import arange
from numpy.random import rand
from numpy.random import seed
from matplotlib import pyplot
# objective function
def objective(x):
return x**2.0
# derivative of objective function
def derivative(x):
return x * 2.0
# gradient descent algorithm
def gradient_descent(objective, derivative, bounds, n_iter, step_size):
# track all solutions
solutions, scores = list(), list()
# generate an initial point
solution = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])
# run the gradient descent
for i in range(n_iter):
# calculate gradient
gradient = derivative(solution)
# take a step
solution = solution - step_size * gradient
# evaluate candidate point
solution_eval = objective(solution)
# store solution
solutions.append(solution)
scores.append(solution_eval)
# report progress
print('>%d f(%s) = %.5f' % (i, solution, solution_eval))
return [solutions, scores]
# seed the pseudo random number generator
seed(4)
# define range for input
bounds = asarray([[-1.0, 1.0]])
# define the total iterations
n_iter = 30
# define the step size
step_size = 0.1
# perform the gradient descent search
solutions, scores = gradient_descent(objective, derivative, bounds, n_iter, step_size)
# sample input range uniformly at 0.1 increments
inputs = arange(bounds[0,0], bounds[0,1]+0.1, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# plot the solutions found
pyplot.plot(solutions, scores, '.-', color='red')
# show the plot
pyplot.show()
Running the example performs the gradient descent search on the objective function as before, except in this case, each point found during the search is plotted.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the search started more than halfway up the right part of the function and stepped downhill to the bottom of the basin.
We can see that in the parts of the objective function with the larger curve, the derivative (gradient) is larger, and in turn, larger steps are taken. Similarly, the gradient is smaller as we get closer to the optima, and in turn, smaller steps are taken.
This highlights that the step size is used as a scale factor on the magnitude of the gradient (curvature) of the objective function.
Plot of the Progress of Gradient Descent on a One Dimensional Objective Function
Gradient Descent Optimization With Momentum
Next, we can update the gradient descent optimization algorithm to use momentum.
This can be achieved by updating the gradient_descent() function to take a “momentum” argument that defines the amount of momentum used during the search.
The change made to the solution must be remembered from the previous iteration of the loop, with an initial value of 0.0.
...
# keep track of the change
change = 0.0
We can then break the update procedure down into first calculating the gradient, then calculating the change to the solution, calculating the position of the new solution, then saving the change for the next iteration.
...
# calculate gradient
gradient = derivative(solution)
# calculate update
new_change = step_size * gradient + momentum * change
# take a step
solution = solution - new_change
# save the change
change = new_change
The updated version of the gradient_descent() function with these changes is listed below.
# gradient descent algorithm
def gradient_descent(objective, derivative, bounds, n_iter, step_size, momentum):
# generate an initial point
solution = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])
# keep track of the change
change = 0.0
# run the gradient descent
for i in range(n_iter):
# calculate gradient
gradient = derivative(solution)
# calculate update
new_change = step_size * gradient + momentum * change
# take a step
solution = solution - new_change
# save the change
change = new_change
# evaluate candidate point
solution_eval = objective(solution)
# report progress
print('>%d f(%s) = %.5f' % (i, solution, solution_eval))
return [solution, solution_eval]
We can then choose a momentum value and pass it to the gradient_descent() function.
After a little trial and error, a momentum value of 0.3 was found to be effective on this problem, given the fixed step size of 0.1.
Tying this together, the complete example of gradient descent optimization with momentum is listed below.
# example of gradient descent with momentum for a one-dimensional function
from numpy import asarray
from numpy.random import rand
from numpy.random import seed
# objective function
def objective(x):
return x**2.0
# derivative of objective function
def derivative(x):
return x * 2.0
# gradient descent algorithm
def gradient_descent(objective, derivative, bounds, n_iter, step_size, momentum):
# generate an initial point
solution = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])
# keep track of the change
change = 0.0
# run the gradient descent
for i in range(n_iter):
# calculate gradient
gradient = derivative(solution)
# calculate update
new_change = step_size * gradient + momentum * change
# take a step
solution = solution - new_change
# save the change
change = new_change
# evaluate candidate point
solution_eval = objective(solution)
# report progress
print('>%d f(%s) = %.5f' % (i, solution, solution_eval))
return [solution, solution_eval]
# seed the pseudo random number generator
seed(4)
# define range for input
bounds = asarray([[-1.0, 1.0]])
# define the total iterations
n_iter = 30
# define the step size
step_size = 0.1
# define momentum
momentum = 0.3
# perform the gradient descent search with momentum
best, score = gradient_descent(objective, derivative, bounds, n_iter, step_size, momentum)
print('Done!')
print('f(%s) = %f' % (best, score))
Running the example starts with a random point in the search space, then applies the gradient descent algorithm with momentum, reporting performance along the way.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the algorithm finds a good solution after about 13 iterations, with a function evaluation of about 0.0.
As expected, this is faster (fewer iterations) than gradient descent without momentum, using the same starting point and step size that took 27 iterations.
Visualization of Gradient Descent Optimization With Momentum
Finally, we can visualize the progress of the gradient descent optimization algorithm with momentum.
The complete example is listed below.
# example of plotting gradient descent with momentum for a one-dimensional function
from numpy import asarray
from numpy import arange
from numpy.random import rand
from numpy.random import seed
from matplotlib import pyplot
# objective function
def objective(x):
return x**2.0
# derivative of objective function
def derivative(x):
return x * 2.0
# gradient descent algorithm
def gradient_descent(objective, derivative, bounds, n_iter, step_size, momentum):
# track all solutions
solutions, scores = list(), list()
# generate an initial point
solution = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])
# keep track of the change
change = 0.0
# run the gradient descent
for i in range(n_iter):
# calculate gradient
gradient = derivative(solution)
# calculate update
new_change = step_size * gradient + momentum * change
# take a step
solution = solution - new_change
# save the change
change = new_change
# evaluate candidate point
solution_eval = objective(solution)
# store solution
solutions.append(solution)
scores.append(solution_eval)
# report progress
print('>%d f(%s) = %.5f' % (i, solution, solution_eval))
return [solutions, scores]
# seed the pseudo random number generator
seed(4)
# define range for input
bounds = asarray([[-1.0, 1.0]])
# define the total iterations
n_iter = 30
# define the step size
step_size = 0.1
# define momentum
momentum = 0.3
# perform the gradient descent search with momentum
solutions, scores = gradient_descent(objective, derivative, bounds, n_iter, step_size, momentum)
# sample input range uniformly at 0.1 increments
inputs = arange(bounds[0,0], bounds[0,1]+0.1, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# plot the solutions found
pyplot.plot(solutions, scores, '.-', color='red')
# show the plot
pyplot.show()
Running the example performs the gradient descent search with momentum on the objective function as before, except in this case, each point found during the search is plotted.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, if we compare the plot to the plot created previously for the performance of gradient descent (without momentum), we can see that the search indeed reaches the optima in fewer steps, noted with fewer distinct red dots on the path to the bottom of the basin.
Plot of the Progress of Gradient Descent With Momentum on a One Dimensional Objective Function
As an extension, try different values for momentum, such as 0.8, and review the resulting plot.
Let me know what you discover in the comments below.
Further Reading
This section provides more resources on the topic if you are looking to go deeper.
Thu Feb 04 2021 17:00:12 GMT+0700 (Western Indonesia Time)
From the global pandemic to recent cyberattacks, our world has faced many challenges during the past 12 months. Some of these challenges we can’t change. However, I’m pleased about the ones we can, and are changing across the cybersecurity landscape. For example, to facilitate remote work and maintain business continuity, organizations are moving more of their apps to the cloud and delivering SaaS experiences.
We know, however, that cybercriminals are taking advantage of this shift. We have seen them increase DDoS attacks, ransomware, and phishing campaigns. So how do you, as a cybersecurity professional help your organization facilitate remote work while strengthening security, reliability, and performance?
The first step is to examine your organization’s security strategy and adopt a Zero Trust approach.
Join me and Sinead O’Donovan, Director of Program Management for Azure Security, in the next Azure Security Experts Series on February 18, 2021, from 10:00 AM to 11:00 AM Pacific Time, as we’re going to focus on another important aspect of Zero Trust network security.
There, we’ll step through three strategies using the cloud-native network security services like Azure Front Door and Azure Firewall to perform:
Segmentation: This includes apps and virtual network segmentation which aims to reduce the attack surface and prevent attackers from moving laterally.
Encryption: Enforcing encryption on the communication channel between user-to-app or app-to-app with industry standards like TLS/SSL.
Threat protection: Employing threat intelligence to help minimize risk from the most sophisticated attacks like bots and malware.
You’ll have the opportunity to take deep dives and see demos on how to use Azure network security cloud-native services for:
Application security and acceleration: Utilize new integrated services like Azure Web Application Firewall and CDN technology to provide app security, scalability, and resiliency.
Advanced cloud network threat protection: Apply advanced firewall capabilities for highly sensitive and regulated environments.
In just one hour, you’ll learn new networking strategies, improve your app security and performance, use cutting-edge network threat protection, and stay ahead of a constantly evolving threat landscape.
To learn more about Microsoft Security solutions visit our website. Bookmark the Security blog to keep up with our expert coverage on security matters. Also, follow us at @MSFTSecurity for the latest news and updates on cybersecurity.
Thu Feb 04 2021 14:05:01 GMT+0700 (Western Indonesia Time)
Do your need to list down the Software’s installed in your machine programmatically. How to get the Name, Software Version, Installed Date, etc. for each software installed quickly ? Don’t know how to do >Don’t worry. MiTec’s System Information Management Suite’s component helps to get these information with less code and we will learn how to use TMiTeC_Software and TMiTeC_MSProduct in this blog post.
Platforms: Windows.
Installation Steps:
You can easily install this Component Suite from GetIt Package Manager. The steps are as follows.
Navigate In RAD Studio IDE->Tools->GetIt Package Manager->select Components in Categories->Components->Trail -MiTec system Information Component Suite 14.3 and click Install Button.
Read the license and Click Agree All. An Information dialog saying ‘Requires a restart of RAD studio at the end of the process. Do you want to proceed? click yes and continue.
It will download the plugin and installs it. Once installed Click Restart now.
How to run the Demo app:
Navigate to the System Information Management Suite trails setup, Demos folder which is installed during Get It installation e.g) C:UsersDocumentsEmbarcaderoStudio21.0CatalogRepositoryMiTeC-14.3DemosDelphi3
Open the SWView project in RAD studio 10.4.1 compile and Run the application.
This Demo App shows how to list down the Installed software’s, enumerate among them and access its properties.
Components used in MSIC PV Demo App:
TMiTeC_Software: Enumerates installed software including system updates and system components.
TMiTeC_MSProduct: Enumerates installed Microsoft® products and their Product keys and IDs.
2 TTabsheet’s one for viewing Software’s list inTListView and other for viewing Microsoft Products in TListView.
TButton to load, save and refresh.
Implementation Details:
An instance SW of TMiTeC_Software is created. Add the list of software’s available by loop through the Count property. Retrieves the TInstallRecord for each InstallEntry and shows the installed software name, version, installed uninstall path etc.
An instance MS of TMiTeC_MSProduct is created. Add the list of Microsoft Products installed by loop through the ProductCount property. Retrieves the TMSRecord for each Products and shows the Product name, Id, key, Registry Path.
procedure TForm1.DisplayData;
var
i: Integer;
begin
with lv.Items do begin
BeginUpdate;
try
Clear;
for i:=0 to SW.Count-1 do
with Add do begin
Caption:=SW.InstallEntry[i].Name;
SubItems.Add(SW.InstallEntry[i].Version);
SubItems.Add(SW.InstallEntry[i].Company);
SubItems.Add(DateToStr(SW.InstallEntry[i].InstallDate));
SubItems.Add(SW.InstallEntry[i].Uninstall);
SubItems.Add(SW.InstallEntry[i].HelpLink);
SubItems.Add(SW.InstallEntry[i].AboutLink);
SubItems.Add(SW.InstallEntry[i].InfoLink);
SubItems.Add(SW.InstallEntry[i].UpdateLink);
end;
finally
EndUpdate;
end;
end;
Tabsheet1.Caption:=Format('Installed Software - %d records',[SW.Count]);
with lvMSP.Items do begin
BeginUpdate;
try
Clear;
for i:=0 to MS.ProductCount-1 do
with Add do begin
Caption:=MS.Products[i].Name;
SubItems.Add(MS.Products[i].ProductID);
SubItems.Add(MS.Products[i].ProductKey);
SubItems.Add(MS.Products[i].RegistryPath);
end;
finally
EndUpdate;
end;
end;
Tabsheet2.Caption:=Format('MS Products - %d records',[MS.ProductCount]);
end;
MiTeC SWView Demo
It’s that simple to list down the software’s installed in your machine and access its properties with less code. Use this MiTeC component suite and get the job done quickly.
Thu Feb 04 2021 13:28:14 GMT+0700 (Western Indonesia Time)
InterBase verfügt über mehrere integrierte Funktionen, mit denen Entwickler SQL-Abfragen erstellen und optimieren können. In einigen Situationen müssen Sie möglicherweise Abfragen erweitern oder mit komplexeren Abfragen arbeiten, die Zeichenfolgen-, Datums- und Statistikfunktionen enthalten. InterBase kann dieses Problem lösen, indem Bibliotheken oder benutzerdefinierte Funktionen oder UDFs unterstützt werden. UDFs sind Programme zum Ausführen benutzerdefinierter Funktionen, die Erweiterungen des Servers sind und als Teil des Serverprozesses ausgeführt werden. Sie können über isql oder ein Programm in der Host-Sprache auf UDFs zugreifen . Sie können auch in gespeicherten Prozeduren und Triggerkörpern auf UDFs zugreifen. UDFs können in einer Datenbankanwendung überall dort verwendet werden, wo eine integrierte SQL-Funktion verwendet werden kann.
Hinzufügen von UDFs zu InterBase
Im Internet sind mehrere UDF-Bibliotheken für InterBase verfügbar, aber eine mit mehreren Funktionen, die Sie sich ansehen können, ist FreeADHocUDF .
InterBase enthält zwei UDF-Dateien in der Installation, eine mit dem Namen udflib.dll (Beispiel für eine Mitarbeiter-Datenbank im Video) und die Datei ib_udf .
In diesem einfachen dreistufigen Prozess können Sie auch Ihre eigene UDF erstellen:
Schreiben Sie die Funktion in eine beliebige Programmiersprache, mit der eine gemeinsam genutzte Bibliothek erstellt werden kann. In Java geschriebene Funktionen werden nicht unterstützt.
Kompilieren Sie die Funktion und verknüpfen Sie sie mit einer dynamisch verknüpften oder gemeinsam genutzten Bibliothek.
Verwenden ERKLäRT EXTERNAL FUNCTION jeden UDF an jede Datenbank zu erklären , in dem Sie benötigen , es zu benutzen.
Weitere Informationen zum Erstellen eigener UDFs finden Sie im docwiki .
Thu Feb 04 2021 13:25:01 GMT+0700 (Western Indonesia Time)
Since the launch of the GetIt package manager a significant number of components and libraries distributed on GetIt. One of them is Radiant Shapes, which is a bonus pack for RAD Studio developers.
Radiant Shapes includes 30+ reusable shape components that are very responsive. It supports all platforms. All of the Radiant Shapes components include valuable design-time menus to create common adjustments instantly. I think every FireMonkey developer should try this Radiant Shapes component set!
In this CodeRage 9 session, Ray Konopka, who is the creator of the Radiant Shapes introduces the utilization of the components and shows several demos in action. One of them is the Tic-Tac-Toe game.
Thu Feb 04 2021 13:19:23 GMT+0700 (Western Indonesia Time)
Ähnlich wie Windows-Themen machen es VCL-Stile einfach, das Erscheinungsbild Ihrer VCL-Anwendungen radikal zu ändern und geben Ihrer Anwendung das gewisse Extra an Glanz und Professionalität. Dank der in 10.4 eingeführten VCL-Stile pro Steuerelement kann ein einzelnes Formular mehrere Stile nutzen, was Ihnen maximale Anpassungsmöglichkeiten und Kontrolle bietet. RAD Studio, Delphi und C++Builder werden mit einer Auswahl an VCL-Styles ausgeliefert, zusätzliche Premium-Styles sind in GetIt oder über DelphiStyles erhältlich. In dieser Webinar-Wiederholung lernen Sie zusammen mit Alexey Sharagin, dem kreativen Genie hinter DelphiStyles, alles, was Sie schon immer über die Arbeit mit VCL-Styles wissen wollten, einschließlich der Anpassung und Erstellung eigener Styles.
Eigenschaften von TStyleManager zur Anpassung von VCL-Styles für Formulare, Dialoge und Menüs
Besonderheiten der High-DPI-Unterstützung
Vorteile der Verwendung von VCL-Styles in der Anwendung
Details zur Unterstützung von Per-Control-Styles
Erstellen und Anpassen von Stilen mit dem Bitmap Style Designer Tool
Verwenden von Stilen von GetIt und DelphiStyles.com
Thu Feb 04 2021 12:55:00 GMT+0700 (Western Indonesia Time)
RAD Studio has two modes, dark and light. Since most of the developers love different kinds of dark modes, they might need several options to choose. But, currently, RAD Studio only offers two dark and light modes.
There is a plugin called Delphi IDE Colorizer that helps to change the whole RAD Studio theme to different looks. In a simple word, you can alter the entire RAD Studio feel of the workspace. According to the project the following features are available:
Features
Support for VCL Styles.
Transparent menus.
Allow to change the icons, set the colors, and gradient direction of the title bar of the docked windows.
Set the colors, and gradient direction of the IDE toolbars.
Improve the drawing of the disabled icons used in menus and toolbars
Thu Feb 04 2021 12:49:41 GMT+0700 (Western Indonesia Time)
Die Zeiten ändern sich und wir stellen uns darauf ein. Um Ihnen auch weiterhin die neuesten Trends rund um die Entwicklungswerkzeuge von Embarcadero zu zeigen, bieten wir diesmal unser bekanntes Roadshow Format online für die gesamte Region DE-AT-CH-LI an.
Sie erleben einen ganzen Tag mit verschiedenen Vorträgen zu der neuesten Technologie rund um Delphi und C++Builder und erfahren von ausgewählten Kunden, wie sie Ihre Projekte entwickeln und modernisieren.
Thu Feb 04 2021 12:10:49 GMT+0700 (Western Indonesia Time)
In Dev-Insider ist ein interessanter Artikel erschienen der Datenbanken als Rückgrat von Enterprise-Applikationen beschreibt. Die relationale Datenbank ist nach wie vor das A und O von Applikationen aus dem Enterprise-Umfeld.
Es werden typische Vertreter relationaler Datenbanken aufgeführt und verglichen, welche häufig in unternehmerischen Applikationslandschaften eingesetzt werden.
InterBase wird unter anderem mit MS SQL Server, MySQL und anderen betrachtet.
Thu Feb 04 2021 11:15:00 GMT+0700 (Western Indonesia Time)
The FireDAC.SchemaAdapterMemTable Sample uses some methods and properties of TFDSchemaAdapter in order to implement some features related with the management of Centralized Cached Updates.
Location
You can find the SchemaAdapterMemTable sample project at:
Start | Programs | Embarcadero RAD Studio Sydney | Samples and then navigate to:
You can find Delphi code samples in GitHub Repositories. Search by name into the samples repositories according to your RAD Studio version.
How to Use the Sample
Navigate to the location given above and open SchemaAdapter.dproj.
Press F9 or choose Run > Run.
Click on the Use Connection Definition combo box and select an option.
Modify the tables and interact with the provided buttons.
Files
File in Delphi
Contains
SchemaAdapter.dproj SchemaAdapter.dpr
The project itself.
fSchemaAdapter.pas fSchemaAdapter.fmx
The main form.
Implementation
When you run the application, click on the Use Connection Definition combo box and select an option in order to define a connection. When you select an item of the combo box, the Open method is called to open all datasets associated with the schema adapter related to this connection. Then, you will see two tables, one in each TDBGrid. Both TDBGrids are used to display and manipulate records from a dataset in a tabular grid. Once the TDBGrids are filled, you can interact with the sample. Each of the following buttons implements an OnClick event to do what is described below:
Change or edit any data record. Then an OnDataChange event uses the ChangeCount property to display the number of changes in the changes log.
Interact with the buttons that provide the sample:
The SavePoint button uses the SavePoint property to return the current position in the changes log.
The RevertPoint button makes the changes log returns to the state when the value of SavePoint was obtained.
The UndoLastChange button uses the UndoLastChange method to cancel the last record change in the schema adapter changes log and to remove the record from the changes log.
The CancelUpdates button uses the CancelUpdates method to cancel changes for all records in this schema adapter changes log and to remove them from the changes log.
The ApplyUpdates button uses:
The ApplyUpdates method to apply changes for all records in the centralized change journal to the database.
The CommitUpdates method to mark all the records in this schema adapter changes log as unmodified and to remove them from the changes log.
For more information, please refer to the link below:
Wed Feb 03 2021 23:07:17 GMT+0700 (Western Indonesia Time)
The MultiViewDemo sample shows how to create an application that implements the “master-detail” interface and explains how to use the master panel presentation modes.
This sample allows you to change the master panel characteristics, such as mode, placement, sliding mode, shadow properties, etc. It also helps you understand how to implement your master panel in the Custom presentation mode.
Location
You can find the FireMonkeyMobile MultiViewDemo sample project at:
Start | Programs | Embarcadero RAD Studio Sydney | Samples and navigate to:
You can find Delphi and C++ code samples in GitHub Repositories. Search by name into the samples repositories according to your RAD Studio version.
How to Run the Sample
Navigate to the location given above and open the project file:
C++Builder: MultiViewDemoCpp.cbproj
Delphi: MultiViewDemo.dproj
Press F9 or choose Run > Run.
How It Works
After you start this sample application, it displays the following form:
Note: This screen displays the 32-bit Windows desktop application form as an example. However, the forms for other target platforms provide similar functionality.
Using this form you can perform the following basic operations:
Wed Feb 03 2021 17:39:17 GMT+0700 (Western Indonesia Time)
RAD Studio is made up of Delphi and C++Builder. On the Delphi side the Object Pascal compiler is a single pass compiler and the compiler itself is not a parallel compiler but when compiling multiple projects in parallel it was able to compile 1 billion lines of Object Pascal code in 5 minutes on the AMD Ryzen 9 5950x 16 core machine. I wanted to see if something similar was possible with C++. This post is part of our modern hardware series where we explore the massive productivity gains that can be achieved on some of the fastest CPUs available at the time of this writing in early 2021. Just how much is 1 billion lines of code? Take a look.
Parallel Compilation In C++Builder
C++Builder has a number of different compilers including the classic Borland compiler and modern Clang based compilers for a number of platforms. Additionally, Embarcadero sponsors the open source Dev-C++ which has the TDM-GCC 9.2.0 compiler bundled with it. GCC 9.2.0 comes with MAKE which supports handles parallel compilation through it’s -j (Jobs) command line switch. C++Builder has an add-on called TwineCompile that brings parallel compilation to C++Builder. Both C++Builder and Dev-C++ are built with Delphi.
During my investigations so far TwineCompile seems to offer more functionality than MAKE Jobs because TwineCompile supports background compilation and some other productivity enhancing features. It is up to to the IDE (Dev-C++) to support additional features like background compilation but at this time Dev-C++ does not while C++Builder does through TwineCompile. Dev-C++ is a great native C++ IDE for Windows development and then C++Builder turns the productivity up to the max with it’s visual designer, powerful built in VCL RTL, and enhanced parallel compilation features. Additionally, they are based around the different C++ compilers so it is not entirely a direct comparison and they really compliment each other.
Third party benchmarks (not the project in this blog post) for a 3990X with TwineCompile:
At the beginning of this quest Dev-C++ did not support the -j MAKE flag so that was the first task to complete. I was able to update Dev-C++ and release the new v6.3 version with the parallel compilation -j built-in as an option now. It is also on by default for release builds so that should greatly reduce compile times for everyone using Dev-C++. The update had to be made because the command line flag that needed to be added had to be added to MAKE and not to the compiler command line. This took a few days to implement and get the new v6.3 version released. Bundled in with this release was all the bug fixes from the last two months and a second new feature where custom embedded console apps can be selected. Here are the release notes for Dev-C++ v6.3:
Version 6.3 – 30 January 2021
Added: Parallel compilation enabled by default for release builds through MAKE Jobs.
Added: 3 Buttons for setting up custom shell command line tabs.
Updated: Code completion and menues for dark themes.
Updated: CTRL-TAB editor tab selection wrapping.
Fixed: Make clean file deletion issue.
Fixed: Status bar not showing all text.
Fixed: Debug/CPU Window hex column issue.
Fixed: Closing tabs in editor side by side view.
Once I had the Dev-C++ IDE that could parallel compile the 1 billion lines of C++ I needed the actual AMD Threadripper 3990X with the 64 cores and 128 threads. The Threadripper scores less per CPU on PassMark than the 5950X but because it has more cores it has a higher overall score. The below screenshot is from PassMark showing a comparison of the two CPUs. As you can see the 5950x has a single core benchmark of 3491 while the 3990x has a single core benchmark of 2553. But the 3990x has a overall multicore benchmark of 80752 right now while the 5950x only has a multicore benchmark of 46045 right now.
Note: Video doesn’t mention the larger 64 core 3990X Threadripper used in this blog post.
ReliableSite.net has cloud based AMD Threadripper 3990X 256GB of RAM machines which fit the needs of this project. They offer two different Windows setups: Windows Standard 2016 and Windows Standard 2019. I selected Windows 2016 and they tried to install the machine with that OS but for whatever release were unable to due to most likely a licensing issue with how Microsoft has the licensing of CPUs and cores in Windows Standard 2016. In any event, they switched it to Windows Standard 2019 and it was able to install just fine.
At this point we are up and running on the Threadripper Windows 2019 machine with C++Builder and TwineCompile plus Dev-C++ v6.3 with it’s new parallel compilation support built-in. Everything tests out and runs great. C++Builder is able to compile the 1 million lines of C++ from a previous post 4X faster than the 5950x did and Delphi is able to compile the 1 billion lines of Object Pascal projects 2.5X faster as well. We’ll leave those two comparisons for another post.
One of the tools I use with the modern hardware posts to gauge the CPU usage is Task Manager DeLuxe from MiTeC. Task Manager DeLuxe is pretty amazing in the amount of information it provides regarding your Windows system. TMX features a dark (very 2021) and light mode. TMX is available from MiTeC which also makes a wide variety of Delphi components that give you access to a lot of the same information found in TMX. Most of the information in TMX is probably available for you to use in your app with the MiTeC System Information Component Suite.
When I first loaded Task Manager DeLuxe up on the Threadripper 3990x 64 core machine it was not able to display the individual CPU graphs and threw out an error. I have a commercial license to Task Manager DeLuxe so I sent an email to Michal at MiTeC and he was able to solve the issue very quickly. He released a new version of Task Manager DeLuxe which now loads up and runs great on the 64 core machine.
The next task was to actually create the 1 billion lines of code C++ project so we can compile it. I started out with this Scimark2 project for Dev-C++ and developed a Delphi app to quickly generate the number of lines of code needed. In the end I wanted to be able to actually run the application created from the 1 billion lines of C++. The Delphi app takes the LU.c and LU.h files and duplicates the last function LU_factor() the number of times needed to create the designed number of lines. The function itself is 69 lines long and to avoid name collisions each generated function has a file number and a iterator number.
I tried a number of different ways to slice the C++ project files up with more files and less lines or more lines and less files. In the Delphi project I did 4 million lines across 250 different projects. For the C++ project one of the ways was with 32,000 files and 31,250 lines per file. I arrived at this number with some testing because it seemed like Dev-C++ did better with smaller files, more files for more cores, and a great number of smaller files mimics a real project more closely. A second way was with 10,666 files and 93,750 lines per file. A third way is with 1000 files and 1000000 lines of C++ per file. The list of files gets added to the Dev-C++ project file after they have been generated which means Dev-C++ has to load that list of files into its project list.
A bottleneck I discovered here is that Dev-C++ has code completion and symbol completion. These features parse the files in the project when the project is opened and suffice to say they are not parallelized yet. Dev-C++ does eventually load but it takes awhile for it to handle the 32,000 files (and even the 10,666 files). Once I figured this out I was able to disable the code completion and symbol completion which allows the 1 billion lines of C++ code project to load quickly. Dev-C++ doesn’t seem to have any trouble editing a file with 1 million lines and it feels pretty snappy.
A second issue I ran into is that Delphi’s System.CPUCount procedure reports 32 instead of the 128 threads. 32 cores might have been enough when the System.CPUCount procedure was written but we’re way beyond that now. In the case of the 5950X which has 16 cores and 32 threads the procedure works great but for the 3990X this was incorrect. I reported this issue to the Embarcadero Quality portal but in the mean time there is a third party NumCPULib4Pascal library which should report the correct value. I built a custom build of the Dev-C++ executable and hard coded in the 128 threads for now.
We’re almost ready to go for the 1 billion lines of code compile now! We have the hardware in place, we have the IDE, and the compilers in place, and we have the projects (slices different ways in place). I have been compiling different size versions of the 1 billion lines of C++ project during the whole process to figure out each of the issues mentioned above and correct them.
Let’s start out with the 1 billion line project split into 32,000 files with 31,250 lines each. This project compiles. It uses all of the cores as it should but when it gets down to linking the 32,000 files into the executable it stalls out. There is a limit on the command line for being able to pass the 32,000 files to the linker. The maximum length of the Windows command line is 32768 bytes which is a USHORT in the Windows API. The second project with the 10,666 files and 93,750 lines per file also compiles but fails out for the same reason.
The third project with the 1000 files and 1,000,000 lines per file compiles as well but more slowly. It does not use all 128 cores during the compilation process. Selecting -j64, -j128, and -j (automatic) from MAKE sees only around ~34 of the 64 cores really fire up though it does execute 64 g++ processes. It uses 81GB of RAM during this process so it’s a good thing the machine has 256GB of RAM. Once all of the files compile it does get past executing the command line but the linker itself crashes out with an error while it is trying to combine all of the object files into the executable. So far the suggestions found on StackOverflow of various command line arguments to pass did not solved the issue.
After so more testing it would appear that the 2GB executable size limit (regardless of using -mcmodel=medium or -mcmodel=large) is the roadblock the above error. I was able to do a 100 file 1,000,000 lines per file compile and it generated a ~1.1GB executable. I started using -Os (which optimizes for size) and that moved the project forward quite a bit. A couple things to note here is that the larger the executable the slower the Scimark2 score is which is interesting. The first successful 1 billion line compile using 1000 1,000,000 line files and -Os generated a 359MB executable in 1483 seconds (24.7 minutes). I also tried 500 files with 2,000,000 lines and that actually took longer. The default Scimark2 project is 4X faster than the project with the extra 1 billion lines of code when the executable is larger and when compiled with -Os.
The 500 file 2,000,000 million lines of code per file used up to 156GB but not all 64 cores.
I don’t feel like this compile time accurately represents the 3990x Threadripper because on the 1 million and 2 million lines of code file sizes all of the cores are not being used. I don’t know if this is an issue with MAKE and G++ or the automated -j setting where it selects the number of cores to use or even if there is an IO bottleneck on the machine it is not able to handle it. The smaller the files the more of the cores the MAKE/G++ -j combo uses. I’ve also tried it with and without the -pipe flag which uses pipes instead of files during the compilation. What is also interesting here is that TwineCompile in C++Builder doesn’t seem to have the same limitation. When using it to parallel compile all of the cores instantly fire up.
Quad Compile
In an effort to get a faster compile time on 1 billion lines of C++ code I loaded up 4 instances of Dev-C++ with 250 1,000,000 lines of code files in the project and compiled all 4 projects at the same time. This is similar to the 1 billion lines of Object Pascal code because under that project it was compiling 250 projects with 4 million lines of code per project. And here we have the results of the quad compile.
Quad Instances Of Dev-C++Note: On this screenshot there is a bug where it is showing 32 cores and 64 threads which should read 64 cores and 128 threads.
1 billion lines of C++ code in 15 minutes on the AMD 3990X Threadripper.
This project was a lot of fun and there are all kinds of different C++ flags for the TDM-GCC compiler like -mtune=native, -mtune=znver2, and -mtune=znver3 which I haven’t tried with this setup. As we’ve seen in this post the software support for a modern machine with 64 cores and 128 threads is still getting all the kinks worked out but generally works and delivers some serious computing power. C++Builder with TwineCompile is a powerful productivity solution for multi-core machines compiling 1 million lines of code very quickly and can work better than the MAKE/GCC parallel compilation Jobs feature due to it’s deep IDE integration. The open source Dev-C++ is a pretty powerful solution when working with large code bases and large files and could take more advantage of the Parallel Programming Library in Delphi. I was impressed by how responsive the Dev-C++ UI is during the parallel compilation. Ready to get started building Windows apps in C++? Try out C++Builder or Dev-C++ from the links below. You can also investigate more about learning C++ and other modern hardware articles featuring the 5950X 16 core machine below.
Wed Feb 03 2021 17:00:34 GMT+0700 (Western Indonesia Time)
Much of our everyday life has moved online with the pandemic continuing to play a role in how we work and communicate with others. This migration has meant that security and privacy continue to remain top-of-mind for both security professionals and those who may not have given these cyber issues a second thought once before.
In this episode of Afternoon Cyber Tea, I had a chance to talk about this impact with cybersecurity expert Theresa Payton, CEO of Fortalice Solutions and co-founder of Dark Cubed.
In our discussion, we focus on Theresa’s experience with election security, social engineering, and about her book “Manipulated: Inside the Cyberwar to Hijack Elections and Distort the Truth.” We also look at how the cyber operatives behind misinformation campaigns choose their targets, and how digital empathy and human-centered design can help combat cybercrime.
“Nation-state hackers invade social issues—such as fracking, elections, or vaccinations—all while posing as Americans,” Theresa explains. She recounts how, in researching her book, she found herself speaking to a group of Macedonian hackers who targeted the 2016 election, only to discover the hackers were apolitical. “We’re pro-capitalism,” they told her, explaining how they’d created detailed models that showed how much revenue they could earn by pushing certain candidates rather than others.
“Microsoft was one of the early leaders in offering free tools to help states improve their voting technology. They looked at something that could be a revenue generator, then chose to make it about the public good instead.”—Theresa Payton, CEO of Fortalice Solutions and co-founder of Dark Cubed
During our conversation, we talk about how social engineering attacks are often made easier by our own trusting natures, with vacation photos, birthdays, and other personal content providing the raw data hackers rely on. Since privacy settings for social media usually require users to opt-in, many users are unknowingly laying their online life out like a buffet for hackers. And, since many people don’t read the terms of service, they often have no idea what data is being collected, or what it’s being used for. Theresa mentions a study done by MIT researchers that found even anonymized data grabbed from phone records, credit card transactions, and mobile apps can be easily cross-referenced by zip code and gender to narrow the user’s identity to within just five people.
Theresa and I agree that people cannot be expected to be experts on cybersecurity or system designs, which is where digital empathy comes into play. As we get better at building security into systems, employees can be free to do what they were hired to do. “Microsoft has been leading the way in going passwordless,” Theresa says. “I’m excited that technology has finally caught up to our needs. Now we’ll only be limited by our own creative minds.”
Find out how Theresa went from working as a bank manager to handling cybersecurity at the George W. Bush White House and get some tips on how to protect yourself from social engineering schemes—listen to the full episode.
What’s next
In this ongoing podcast series, I talk with cybersecurity influencers about the evolving threat landscape and explore the promise of systems powered by AI, IoT) and other emerging tech. In every episode, we’ll look at how to empower people and organizations to create a more secure, productive digital environment.
Listen to Afternoon Cyber Tea with Ann Johnson on:
Apple Podcasts: You can also download the episode by clicking the Episode Website link.
Podcast One: Includes the option to subscribe—so you’re notified as soon as new episodes are available.
CISO Spotlight page: Listen alongside our CISO Spotlight episodes, where customers and security experts discuss similar topics such as Zero Trust, compliance, going passwordless, and more.
In the meantime, bookmark the Security blog to keep up with our expert coverage on security matters. Also, follow us at @MSFTSecurity for the latest news and updates on cybersecurity. Or reach out to me on LinkedIn or Twitter if you have guest or topic suggestions.
Wed Feb 03 2021 14:04:01 GMT+0700 (Western Indonesia Time)
Do you need to identify Storage Devices available or connected to the machine and perform some actions to the Storage Devices programmatically? How to enumerate among the Storage Devices quickly ? Don’t know how to do. Don’t worry. MiTec’s System Information Management Suite’s component helps to enumerate the available Internal or external Storage devices and we will learn how to use use the TMiTec_Storage, TMiTeC_Disk component in this blog post.
Platforms: Windows.
Installation Steps:
You can easily install this Component Suite from GetIt Package Manager. The steps are as follows.
Navigate In RAD Studio IDE->Tools->GetIt Package Manager->select Components in Categories->Components->Trail -MiTec system Information Component Suite 14.3 and click Install Button.
Read the license and Click Agree All. An Information dialog saying ‘Requires a restart of RAD studio at the end of the process. Do you want to proceed? click yes and continue.
It will download the plugin and installs it. Once installed Click Restart now.
How to run the Demo app:
Navigate to the System Information Management Suite trails setup, Demos folder which is installed during Get It installation e.g) C:UsersDocumentsEmbarcaderoStudio21.0CatalogRepositoryMiTeC-14.3DemosDelphi5
Open the DiskView project in RAD studio 10.4.1 Compile and Run the application.
This Demo App shows how to list down the internal and external storage devices, enumerate among them and access its properties.
Components used in MSIC DiskView Demo App:
TMiTeC_Disk Properties
TMiTeC_Disk: Detects properties of given logical disk.
TMiTeC_Storage: Enumerates logical drives and physical storage devices as disks, tapes, CD/DVD etc.
TMiTeC_DeviceMonitor : Catches USB, Bluetooth devices or TV/monitor connection/disconnection, volumes mount/unmount, CD/DVD insert/eject and other events from other devices
TTreeView to list the Storage Device nodes and TListView to show the Selected Storage Device properties.
TButton’s to save and refresh.
Implementation Details:
TMiTeC_Storage Properties
An instance is created Storage of TMiTeC_Storage, Disk of TMiTeC_Disk and DeviceMonitor of TMiTeC_DeviceMonitor were created. Call cmRefresh where list of Storage devices were added to the tree node by loop through Storage.PhysicalCount. Further the list of Logical partitions were added to the physical tree node by loop through storage.LogicalCount. For each logical partitions, some of the logical storage device properties were listed in the list view.
procedure Twnd_dv_Main.cmRefresh(Sender: TObject);
var
rd,c,i,j,ii: Integer;
n,r: TTreeNode;
pi: PInteger;
s,d: string;
g: TGUID;
begin
d:='';
Tree.OnChange:=nil;
with Storage do
try
Screen.Cursor:=crHourGlass;
RefreshData;
Tree.Items.BeginUpdate;
try
Tree.Items.Clear;
c:=PhysicalCount;
for i:=0 to PhysicalCount-1 do
with Physical[i] do begin
New(pi);
pi^:=i;
if Size>0 then
r:=Tree.Items.AddChildObject(nil,Trim(Format('%s (%d MB)',[Model,Size shr 20])),pi)
else
r:=Tree.Items.AddChildObject(nil,Trim(Format('%s',[Model])),pi);
g:=GUID_DEVCLASS_DISKDRIVE;
case DeviceType of
FILE_DEVICE_CD_ROM,
FILE_DEVICE_DVD: g:=GUID_DEVCLASS_CDROM;
FILE_DEVICE_TAPE: g:=GUID_DEVCLASS_TAPEDRIVE;
FILE_DEVICE_DISK: if Removable then
g:=GUID_DEVCLASS_FDC;
end;
SetupDiGetClassImageIndex(spid,g,ii);
r.ImageIndex:=ii;
r.SelectedIndex:=r.ImageIndex;
for j:=0 to LogicalCount-1 do
with Logical[j] do
if PhysicalIndex=i then begin
d:=d+Copy(Drive,1,1);
New(pi);
pi^:=j;
Disk.Drive:=Drive+':';
if Disk.Capacity=0 then
n:=Tree.Items.AddChildObject(r,Format('%s:',[Drive]),pi)
else begin
if not(DeviceType in [FILE_DEVICE_CD_ROM,FILE_DEVICE_DVD, FILE_DEVICE_TAPE,FILE_DEVICE_UNKNOWN]) and (Length(Layout)>0) and (LayoutIndex>-1) then
n:=Tree.Items.AddChildObject(r,Format('%s: (%s %s - %d MB)',[
Drive,
GetPartitionType(Layout[LayoutIndex].Number,Layout[LayoutIndex].Typ),
FileSystem,//GetPartitionSystem(Layout[LayoutIndex].Typ),
Layout[LayoutIndex].Length.QuadPart shr 20]),pi)
else
n:=Tree.Items.AddChildObject(r,Format('%s: (%s - %d MB)',[Drive,Disk.FileSystem,Disk.Capacity shr 20]),pi);
end;
g:=GUID_DEVCLASS_VOLUME;
SetupDiGetClassImageIndex(spid,g,ii);
n.ImageIndex:=ii;
n.SelectedIndex:=n.ImageIndex;
end;
end;
new(pi);
pi^:=-1;
r:=Tree.Items.AddChildObject(nil,'Network drives',pi);
g:=GUID_DEVCLASS_DISKDRIVE;
SetupDiGetClassImageIndex(spid,g,ii);
r.ImageIndex:=ii;
r.SelectedIndex:=r.ImageIndex;
Disk.RefreshData;
s:=Disk.AvailableDisks;
with Disk do
for i:=1 to Length(s) do begin
Drive:=Format('%s:',[Copy(s,i,1)]);
if MediaType=dtRemote then begin
d:=d+Copy(Drive,1,1);
new(pi);
pi^:=i;
n:=Tree.Items.AddChildObject(r,Format('%s (%s)',[Drive,UNCPath]),pi);
g:=GUID_DEVCLASS_VOLUME;
SetupDiGetClassImageIndex(spid,g,ii);
n.ImageIndex:=ii;
n.SelectedIndex:=n.ImageIndex;
end;
end;
if r.Count=0 then
Tree.Items.Delete(r);
new(pi);
pi^:=-2;
r:=Tree.Items.AddChildObject(nil,'Removable drives',pi);
g:=GUID_DEVCLASS_DISKDRIVE;
SetupDiGetClassImageIndex(spid,g,ii);
r.ImageIndex:=ii;
r.SelectedIndex:=r.ImageIndex;
with Disk do
for i:=1 to Length(s) do begin
Drive:=Format('%s:',[Copy(s,i,1)]);
if (Pos(Copy(s,i,1),d)=0) and (MediaType=dtRemovable) then begin
d:=d+Copy(Drive,1,1);
new(pi);
pi^:=i;
n:=Tree.Items.AddChildObject(r,Format('%s',[Drive]),pi);
g:=GUID_DEVCLASS_VOLUME;
SetupDiGetClassImageIndex(spid,g,ii);
n.ImageIndex:=ii;
n.SelectedIndex:=n.ImageIndex;
Inc(rd);
end;
end;
if r.Count=0 then
Tree.Items.Delete(r);
new(pi);
pi^:=-2;
r:=Tree.Items.AddChildObject(nil,'Other drives',pi);
g:=GUID_DEVCLASS_DISKDRIVE;
SetupDiGetClassImageIndex(spid,g,ii);
r.ImageIndex:=ii;
r.SelectedIndex:=r.ImageIndex;
with Disk do
for i:=1 to Length(s) do begin
if Pos(Copy(s,i,1),d)=0 then begin
Drive:=Format('%s:',[Copy(s,i,1)]);
new(pi);
pi^:=i;
n:=Tree.Items.AddChildObject(r,Format('%s',[Drive]),pi);
g:=GUID_DEVCLASS_VOLUME;
SetupDiGetClassImageIndex(spid,g,ii);
n.ImageIndex:=ii;
n.SelectedIndex:=n.ImageIndex;
end;
end;
if r.Count=0 then
Tree.Items.Delete(r);
Tree.FullExpand;
finally
Tree.Items.EndUpdate;
end;
finally
Screen.Cursor:=crDefault;
Caption:=Format('Storage Devices (%d physical, %d logical)',[PhysicalCount+rd, Length(s)]);
end;
Tree.Items[0].MakeVisible;
Tree.OnChange:=TreeChange;
end;
Display the selected Disk View properties on TreeChange event as shown below.
procedure Twnd_dv_Main.TreeChange(Sender: TObject; Node: TTreeNode);
var
s: string;
begin
List.Items.BeginUpdate;
List.Columns.BeginUpdate;
try
List.Items.Clear;
if Assigned(Node) and Assigned(Node.Data) then begin
if PInteger(Node.Data)^<0 then
Exit;
if Node.Level=0 then with Storage.Physical[PInteger(Node.Data)^] do begin
with List.Items.Add do begin
Caption:='Serial number';
SubItems.Add(SerialNumber);
end;
with List.Items.Add do begin
Caption:='Revision';
SubItems.Add(Revision);
end;
with List.Items.Add do begin
Caption:='Model';
SubItems.Add(Model);
end;
with List.Items.Add do begin
Caption:='Bus Type';
SubItems.Add(GetStorageBusTypeStr(BusType));
end;
s:='';
case DeviceType of
FILE_DEVICE_CD_ROM: s:='CD-ROM';
FILE_DEVICE_DVD: s:='DVD';
FILE_DEVICE_MASS_STORAGE: s:='Mass Storage';
FILE_DEVICE_TAPE: s:='Tape';
FILE_DEVICE_DISK: begin
s:='Drive';
if SSD then
s:='Solid State Drive';
end;
end;
if s<>'' then
with List.Items.Add do begin
Caption:='Device Type';
SubItems.Add(s);
end;
with List.Items.Add do begin
Caption:='Media Type';
SubItems.Add(GetDeviceMediaTypeStr(MediaType));
end;
if (DeviceType=FILE_DEVICE_CD_ROM) or (DeviceType=FILE_DEVICE_DVD) then begin
s:='';
if Read_CDRW then
s:=s+'CD-R,';
if Read_CDR then
s:=s+'CD-RW,';
if Read_DVDROM then
s:=s+'DVD-ROM,';
if Read_DVDR then
s:=s+'DVD-R,';
if Read_DVDRAM then
s:=s+'DVD-RAM,';
SetLength(s,Length(s)-1);
with List.Items.Add do begin
Caption:='Read Caps';
SubItems.Add(s);
end;
s:='';
if Write_CDRW then
s:=s+'CD-R,';
if Write_CDR then
s:=s+'CD-RW,';
if Write_DVDR then
s:=s+'DVD-R,';
if Write_DVDRAM then
s:=s+'DVD-RAM,';
SetLength(s,Length(s)-1);
with List.Items.Add do begin
Caption:='Write Caps';
SubItems.Add(s);
end;
end;
if HaId>=0 then
with List.Items.Add do begin
Caption:='SCSI adapter';
SubItems.Add(IntToStr(HaId));
end;
if PathId>=0 then
with List.Items.Add do begin
Caption:='Bus';
SubItems.Add(IntToStr(PathId));
end;
if Target>=0 then
with List.Items.Add do begin
Caption:='Target device';
SubItems.Add(IntToStr(Target));
end;
if Lun>=0 then
with List.Items.Add do begin
Caption:='Logical unit number';
SubItems.Add(IntToStr(Lun));
end;
//end;
if Temperature>0 then
with List.Items.Add do begin
Caption:='Temperature';
SubItems.Add(Format('%d°C',[Temperature]));
end;
if PowerOnHours>0 then
with List.Items.Add do begin
Caption:='Power-on Hours';
SubItems.Add(Format('%d',[PowerOnHours]));
end;
if Size>0 then begin
with List.Items.Add do begin
Caption:='Capacity';
SubItems.Add(Format('%d MB',[Size shr 20]));
end;
with List.Items.Add do begin
Caption:='Cyls';
SubItems.Add(Format('%d',[Geometry.Cylinders.QuadPart]));
end;
with List.Items.Add do begin
Caption:='Heads';
SubItems.Add(Format('%d',[Geometry.TracksPerCylinder]));
end;
with List.Items.Add do begin
Caption:='Sectors per track';
SubItems.Add(Format('%d',[Geometry.SectorsPerTrack]));
end;
with List.Items.Add do begin
Caption:='Bytes per sector';
SubItems.Add(Format('%d',[Geometry.BytesPerSector]));
end;
if (IdentifyDeviceData.Max48BitLBA[0]=0) then
with List.Items.Add do begin
Caption:='Physical sectors';
if (Geometry.BytesPerSector>0) then
SubItems.Add(Format('%d',[LengthInBytes div Geometry.BytesPerSector]))
else
SubItems.Add(Format('%d',[Geometry.Cylinders.QuadPart*Geometry.TracksPerCylinder*Geometry.SectorsPerTrack]));
end
else begin
with List.Items.Add do begin
Caption:='Number of sectors';
SubItems.Add(Format('%d',[IdentifyDeviceData.CurrentSectorCapacity]));
end;
with List.Items.Add do begin
Caption:='Total 32-bit LBA sectors';
SubItems.Add(Format('%d',[IdentifyDeviceData.UserAddressableSectors]));
end;
with List.Items.Add do begin
Caption:='Total 48-bit LBA sectors';
SubItems.Add(Format('%d',[IdentifyDeviceData.Max48BitLBA[0]]));
end;
end;
end;
if IdentifyDeviceData.MajorRevision>0 then
with List.Items.Add do begin
Caption:='ATA Major version';
SubItems.Add(GetATAMajorVersion(IdentifyDeviceData.MajorRevision));
end;
if IdentifyDeviceData.MinorRevision>0 then
with List.Items.Add do begin
Caption:='ATA Minor version';
SubItems.Add(GetATAMinorVersion(IdentifyDeviceData.MinorRevision));
end;
if IdentifyDeviceData.ReservedWord220[2]>0 then
with List.Items.Add do begin
Caption:='ATA Transport version';
SubItems.Add(GetATATransportVersion(IdentifyDeviceData.ReservedWord220[2]));
end;
if ECCCode<>0 then
with List.Items.Add do begin
Caption:='ECC';
SubItems.Add(Format('%d',[ECCCode]));
end;
if CtlBufSize<>0 then
with List.Items.Add do begin
Caption:='Cache Buffer size';
SubItems.Add(Format('%d KB',[CtlBufSize shr 10]));
end;
with List.Items.Add do begin
Caption:='S.M.A.R.T.';
if SMARTSupport then begin
if SMARTActive then
SubItems.Add('Supported and active')
else
SubItems.Add('Supported and NOT active');
end else
SubItems.Add('NOT supported');
end;
end else begin
if PInteger(Node.Parent.Data)^<0 then
Disk.Drive:=Copy(Disk.AvailableDisks,PInteger(Node.Data)^,1)+':'
else
Disk.Drive:=Storage.Logical[PInteger(Node.Data)^].Drive+':';
with List.Items.Add do begin
Caption:='Volume label';
SubItems.Add(Disk.VolumeLabel);
end;
with List.Items.Add do begin
Caption:='Serial number';
SubItems.Add(Disk.SerialNumber);
end;
with List.Items.Add do begin
Caption:='Capacity';
SubItems.Add(Format('%d MB',[Disk.Capacity shr 20]));
end;
with List.Items.Add do begin
Caption:='Free';
SubItems.Add(Format('%d MB',[Disk.FreeSpace shr 20]));
end;
with List.Items.Add do begin
Caption:='File system';
SubItems.Add(Disk.FileSystem);
end;
with Storage.Logical[PInteger(Node.Data)^] do
if LayoutIndex>-1 then begin
with List.Items.Add do begin
Caption:='First sector';
SubItems.Add(IntToStr(Layout[LayoutIndex].StartingOffset.QuadPart div Geometry.BytesPerSector));
end;
with List.Items.Add do begin
Caption:='Last sector';
SubItems.Add(IntToStr((Layout[LayoutIndex].StartingOffset.QuadPart+Layout[LayoutIndex].Length.QuadPart-1) div Geometry.BytesPerSector));
end;
with List.Items.Add do begin
Caption:='Cluster size';
SubItems.Add(Format('%d B',[ClusterSize]));
end;
with List.Items.Add do begin
Caption:='Total sectors';
SubItems.Add(IntToStr(Layout[LayoutIndex].Length.QuadPart div Geometry.BytesPerSector));
end;
end;
end;
end;
finally
List.Items.EndUpdate;
List.Columns.EndUpdate;
end;
end;
Use DeviceMonitor events OnVolumeConnect,OnVolumeDisconnect to identify the Storage device arrival/removal and refresh the tree view accordingly.
DiskView Demo
It’s that simple to enumerate Storage Devices connected and list its properties for your application. Use this MiTeC component suite and get the job done quickly.
Delphi版のCalculatorは、比較したプログラムの中で開発時間が最も短かったわけではありませんが、開発者がGUI構築のために記述したコードの行数は、合計入力行数のわずか18%でした。RAD Studio IDEでは、標準コントロールコンポーネントをフォームデザイナにドラッグ&ドロップで配置し、オブジェクトインスペクタを用いてプロパティを変更することで、GUIの迅速な設計、初期化が可能でした。そのため、開発者がCalculatorのインターフェイスを初期化するために必要となるコードを、最小限に抑えることができたのです。一方、Electron Calculatorの場合、開発者が記述したGUI対応コードは合計行数の39%、WPFでは49%に相当しました。
Microsoft Visual StudioのWPFでは、ドラッグ&ドロップによるGUI構築が可能なビジュアル設計をサポートしていますが、Delphiと比較して、GUIの実装により多くのXAMLコードが必要になるため、設計工程が長引く結果となっています。開発時間を左右するもう一つの要因は、Calculator ロジックをユーザーインターフェイスに結合するために必要なコード量です。2言語を駆使し、3つのファイルの間で合計680行のコードを必要とするWPFのCalculatorが最下位にあることは驚きではありません。
DelphiのRAD Studio IDEでは、GUI設計に、コンポーネントのドラッグ&ドロップによるWYSIWYG(What-You-See-Is-What-You-Get)設計エディタを使用できます。設計したGUIは、ネイティブのAndroid / iOS / Windows / macOSスタイル、あるいはカスタムスタイルを用いて表示できるほか、さまざまな画面サイズのモバイルデバイスをシミュレートして表示できます。コンポーネントの大きさの変更や各種プロパティの変更は、オブジェクトインスペクタを用いて行え、コードを記述する必要がありません。そのため、ビジュアル開発ですばやくプロトタイピングを行うことができます。Delphiでは、開発者が単純なYAMLスタイルの言語定義を用いてUIを編集する機能も用意されています。こちらのビデオでは、DelphiのUIデザイナーによるUI設計の詳細を解説しています。以下の画面ショットは、開発中のDelphi版Calculatorのビジュアル設計のプレビューです。Delphiでアプリケーション開発に要した時間は、およそ4時間半でした。
Tue Feb 02 2021 23:11:43 GMT+0700 (Western Indonesia Time)
LearnCPlusPlus.org is a great resource for learning C++. It has a number of posts that cover the basics like selecting a C++ IDE and a C++ compiler (we know you’ll choose C++Builder and Dev-C++ for maximum productivity, right First up we have a top 6 compilers list. Next we list the top c++ compilers. Following that we have a video about Test Drive C++ by Phil Nash at Cppcon 2020. Rounding out these 7 tips we have a post about Unicode strings on Windows, analyzing camera images in C++Builder, If statements in C++, and lastly another video talk from Cppcon 2020 on Cross-Platform Pitfalls and How To Avoid them by Erika Sweet.
Tue Feb 02 2021 22:52:42 GMT+0700 (Western Indonesia Time)
TMS providers hundreds of different components for FMX and VCL. TMS iCL is one of them which provides 100% iOS performance, 100% iOS look, 100% iOS feel components.
The TMS iCL includes several dozens of native component for iOS
TTMSFMXNativeCameraViewController
TTMSFMXNativeBarCodeScanner
TTMSFMXNativeAVPlayerViewController
TTMSFMXNativeUIDocumentInteractionController
TTMSFMXNativeLocalAuthentication
TTMSFMXNativeCLLocationManager
TTMSFMXNativeCMMotionManager
TTMSFMXNativeCMAltimeter
TTMSFMXNativeMultipeerConnectivity
TTMSFMXNativeiCloudDocument
TTMSFMXNativePDFLib
TTMSFMXNativeiCloud
TTMSFMXNativeUICollectionView
TTMSFMXNativeUIActivityIndicatorView
and more
These components are just part of them. It provides all the main components and libraries. Moreover, iCL components implement most of the native libraries. For instance, Face detection functionality on the TTMSFMXNativeUIImageView component. Furthermore, the TTMSFMXNativeiCloud has the capability to access the iCloud key-value storage.
Tue Feb 02 2021 18:00:28 GMT+0700 (Western Indonesia Time)
Last Updated on February 8, 2021
Weight initialization is an important design choice when developing deep learning neural network models.
Historically, weight initialization involved using small random numbers, although over the last decade, more specific heuristics have been developed that use information, such as the type of activation function that is being used and the number of inputs to the node.
These more tailored heuristics can result in more effective training of neural network models using the stochastic gradient descent optimization algorithm.
In this tutorial, you will discover how to implement weight initialization techniques for deep learning neural networks.
After completing this tutorial, you will know:
Weight initialization is used to define the initial values for the parameters in neural network models prior to training the models on a dataset.
How to implement the xavier and normalized xavier weight initialization heuristics used for nodes that use the Sigmoid or Tanh activation functions.
How to implement the he weight initialization heuristic used for nodes that use the ReLU activation function.
Let’s get started.
Updated Feb/2020: Fixed typo in equation for normalized xavier.
Weight Initialization for Deep Learning Neural Networks Photo by Andres Alvarado, some rights reserved.
Tutorial Overview
This tutorial is divided into three parts; they are:
Weight Initialization for Neural Networks
Weight Initialization for Sigmoid and Tanh
Xavier Weight Initialization
Normalized Xavier Weight Initialization
Weight Initialization for ReLU
He Weight Initialization
Weight Initialization for Neural Networks
Weight initialization is an important consideration in the design of a neural network model.
The nodes in neural networks are composed of parameters referred to as weights used to calculate a weighted sum of the inputs.
Neural network models are fit using an optimization algorithm called stochastic gradient descent that incrementally changes the network weights to minimize a loss function, hopefully resulting in a set of weights for the mode that is capable of making useful predictions.
This optimization algorithm requires a starting point in the space of possible weight values from which to begin the optimization process. Weight initialization is a procedure to set the weights of a neural network to small random values that define the starting point for the optimization (learning or training) of the neural network model.
… training deep models is a sufficiently difficult task that most algorithms are strongly affected by the choice of initialization. The initial point can determine whether the algorithm converges at all, with some initial points being so unstable that the algorithm encounters numerical difficulties and fails altogether.
Each time, a neural network is initialized with a different set of weights, resulting in a different starting point for the optimization process, and potentially resulting in a different final set of weights with different performance characteristics.
For more on the expectation of different results each time the same algorithm is trained on the same dataset, see the tutorial:
We cannot initialize all weights to the value 0.0 as the optimization algorithm results in some asymmetry in the error gradient to begin searching effectively.
For more on why we initialize neural networks with random weights, see the tutorial:
Historically, weight initialization follows simple heuristics, such as:
Small random values in the range [-0.3, 0.3]
Small random values in the range [0, 1]
Small random values in the range [-1, 1]
These heuristics continue to work well in general.
We almost always initialize all the weights in the model to values drawn randomly from a Gaussian or uniform distribution. The choice of Gaussian or uniform distribution does not seem to matter very much, but has not been exhaustively studied. The scale of the initial distribution, however, does have a large effect on both the outcome of the optimization procedure and on the ability of the network to generalize.
Nevertheless, more tailored approaches have been developed over the last decade that have become the defacto standard given they may result in a slightly more effective optimization (model training) process.
These modern weight initialization techniques are divided based on the type of activation function used in the nodes that are being initialized, such as “Sigmoid and Tanh” and “ReLU.”
Next, let’s take a closer look at these modern weight initialization heuristics for nodes with Sigmoid and Tanh activation functions.
Weight Initialization for Sigmoid and Tanh
The current standard approach for initialization of the weights of neural network layers and nodes that use the Sigmoid or TanH activation function is called “glorot” or “xavier” initialization.
There are two versions of this weight initialization method, which we will refer to as “xavier” and “normalized xavier.”
Glorot and Bengio proposed to adopt a properly scaled uniform distribution for initialization. This is called “Xavier” initialization […] Its derivation is based on the assumption that the activations are linear. This assumption is invalid for ReLU and PReLU.
Both approaches were derived assuming that the activation function is linear, nevertheless, they have become the standard for nonlinear activation functions like Sigmoid and Tanh, but not ReLU.
Let’s take a closer look at each in turn.
Xavier Weight Initialization
The xavier initialization method is calculated as a random number with a uniform probability distribution (U) between the range -(1/sqrt(n)) and 1/sqrt(n), where n is the number of inputs to the node.
weight = U [-(1/sqrt(n)), 1/sqrt(n)]
We can implement this directly in Python.
The example below assumes 10 inputs to a node, then calculates the lower and upper bounds of the range and calculates 1,000 initial weight values that could be used for the nodes in a layer or a network that uses the sigmoid or tanh activation function.
After calculating the weights, the lower and upper bounds are printed as are the min, max, mean, and standard deviation of the generated weights.
The complete example is listed below.
# example of the xavier weight initialization
from math import sqrt
from numpy import mean
from numpy.random import rand
# number of nodes in the previous layer
n = 10
# calculate the range for the weights
lower, upper = -(1.0 / sqrt(n)), (1.0 / sqrt(n))
# generate random numbers
numbers = rand(1000)
# scale to the desired range
scaled = lower + numbers * (upper - lower)
# summarize
print(lower, upper)
print(scaled.min(), scaled.max())
print(scaled.mean(), scaled.std())
Running the example generates the weights and prints the summary statistics.
We can see that the bounds of the weight values are about -0.316 and 0.316. These bounds would become wider with fewer inputs and more narrow with more inputs.
We can see that the generated weights respect these bounds and that the mean weight value is close to zero with the standard deviation close to 0.17.
It can also help to see how the spread of the weights changes with the number of inputs.
For this, we can calculate the bounds on the weight initialization with different numbers of inputs from 1 to 100 and plot the result.
The complete example is listed below.
# plot of the bounds on xavier weight initialization for different numbers of inputs
from math import sqrt
from matplotlib import pyplot
# define the number of inputs from 1 to 100
values = [i for i in range(1, 101)]
# calculate the range for each number of inputs
results = [1.0 / sqrt(n) for n in values]
# create an error bar plot centered on 0 for each number of inputs
pyplot.errorbar(values, [0.0 for _ in values], yerr=results)
pyplot.show()
Running the example creates a plot that allows us to compare the range of weights with different numbers of input values.
We can see that with very few inputs, the range is large, such as between -1 and 1 or -0.7 to -7. We can then see that our range rapidly drops to about 20 weights to near -0.1 and 0.1, where it remains reasonably constant.
Plot of Range of Xavier Weight Initialization With Inputs From One to One Hundred
Normalized Xavier Weight Initialization
The normalized xavier initialization method is calculated as a random number with a uniform probability distribution (U) between the range -(sqrt(6)/sqrt(n + m)) and sqrt(6)/sqrt(n + m), where n us the number of inputs to the node (e.g. number of nodes in the previous layer) and m is the number of outputs from the layer (e.g. number of nodes in the current layer).
weight = U [-(sqrt(6)/sqrt(n + m)), sqrt(6)/sqrt(n + m)]
We can implement this directly in Python as we did in the previous section and summarize the statistical summary of 1,000 generated weights.
The complete example is listed below.
# example of the normalized xavier weight initialization
from math import sqrt
from numpy import mean
from numpy.random import rand
# number of nodes in the previous layer
n = 10
# number of nodes in the next layer
m = 20
# calculate the range for the weights
lower, upper = -(sqrt(6.0) / sqrt(n + m)), (sqrt(6.0) / sqrt(n + m))
# generate random numbers
numbers = rand(1000)
# scale to the desired range
scaled = lower + numbers * (upper - lower)
# summarize
print(lower, upper)
print(scaled.min(), scaled.max())
print(scaled.mean(), scaled.std())
Running the example generates the weights and prints the summary statistics.
We can see that the bounds of the weight values are about -0.447 and 0.447. These bounds would become wider with fewer inputs and more narrow with more inputs.
We can see that the generated weights respect these bounds and that the mean weight value is close to zero with the standard deviation close to 0.17.
It can also help to see how the spread of the weights changes with the number of inputs.
For this, we can calculate the bounds on the weight initialization with different numbers of inputs from 1 to 100 and a fixed number of 10 outputs and plot the result.
The complete example is listed below.
# plot of the bounds of normalized xavier weight initialization for different numbers of inputs
from math import sqrt
from matplotlib import pyplot
# define the number of inputs from 1 to 100
values = [i for i in range(1, 101)]
# define the number of outputs
m = 10
# calculate the range for each number of inputs
results = [1.0 / sqrt(n + m) for n in values]
# create an error bar plot centered on 0 for each number of inputs
pyplot.errorbar(values, [0.0 for _ in values], yerr=results)
pyplot.show()
Running the example creates a plot that allows us to compare the range of weights with different numbers of input values.
We can see that the range starts wide at about -0.3 to 0.3 with few inputs and reduces to about -0.1 to 0.1 as the number of inputs increases.
Compared to the non-normalized version in the previous section, the range is initially smaller, although transitions to the compact range at a similar rate.
Plot of Range of Normalized Xavier Weight Initialization With Inputs From One to One Hundred
Weight Initialization for ReLU
The “xavier” weight initialization was found to have problems when used to initialize networks that use the rectified linear (ReLU) activation function.
As such, a modified version of the approach was developed specifically for nodes and layers that use ReLU activation, popular in the hidden layers of most multilayer Perceptron and convolutional neural network models.
The current standard approach for initialization of the weights of neural network layers and nodes that use the rectified linear (ReLU) activation function is called “he” initialization.
The he initialization method is calculated as a random number with a Gaussian probability distribution (G) with a mean of 0.0 and a standard deviation of sqrt(2/n), where n is the number of inputs to the node.
weight = G (0.0, sqrt(2/n))
We can implement this directly in Python.
The example below assumes 10 inputs to a node, then calculates the standard deviation of the Gaussian distribution and calculates 1,000 initial weight values that could be used for the nodes in a layer or a network that uses the ReLU activation function.
After calculating the weights, the calculated standard deviation is printed as are the min, max, mean, and standard deviation of the generated weights.
The complete example is listed below.
# example of the he weight initialization
from math import sqrt
from numpy.random import randn
# number of nodes in the previous layer
n = 10
# calculate the range for the weights
std = sqrt(2.0 / n)
# generate random numbers
numbers = randn(1000)
# scale to the desired range
scaled = numbers * std
# summarize
print(std)
print(scaled.min(), scaled.max())
print(scaled.mean(), scaled.std())
Running the example generates the weights and prints the summary statistics.
We can see that the bound of the calculated standard deviation of the weights is about 0.447. This standard deviation would become larger with fewer inputs and smaller with more inputs.
It can also help to see how the spread of the weights changes with the number of inputs.
For this, we can calculate the bounds on the weight initialization with different numbers of inputs from 1 to 100 and plot the result.
The complete example is listed below.
# plot of the bounds on he weight initialization for different numbers of inputs
from math import sqrt
from matplotlib import pyplot
# define the number of inputs from 1 to 100
values = [i for i in range(1, 101)]
# calculate the range for each number of inputs
results = [sqrt(2.0 / n) for n in values]
# create an error bar plot centered on 0 for each number of inputs
pyplot.errorbar(values, [0.0 for _ in values], yerr=results)
pyplot.show()
Running the example creates a plot that allows us to compare the range of weights with different numbers of input values.
We can see that with very few inputs, the range is large, near -1.5 and 1.5 or -1.0 to -1.0. We can then see that our range rapidly drops to about 20 weights to near -0.1 and 0.1, where it remains reasonably constant.
Plot of Range of He Weight Initialization With Inputs From One to One Hundred
Further Reading
This section provides more resources on the topic if you are looking to go deeper.
Tue Feb 02 2021 13:19:35 GMT+0700 (Western Indonesia Time)
Database designing and maintaining the data is a crucial part of the developer’s job. Sometimes, you might need to compare SQL objects and records. Or maybe synchronize the structure and table data for many databases, like, FireBird, Oracle, MySQL, MS SQL, Interbase. At that point, Database Comparer can give you fast solutions to your problems.
Database Comparer is free for non-commercial use and gives all the functionality that you need to comparing and synchronizing. You also can use it for educational purposes. Here is the feature list and component list from the developer.
Features at a glance:
Compare two databases, database and SQL/DDL script, two SQL/DDL scripts
Synchronize data between two database tables
Extract database structure
Compare specific database objects or entire databases
Royalty free licensing. Free Unlimited Email support
Fully-indexed help documentation. Delphi and C++Builder demos code
Tue Feb 02 2021 13:08:19 GMT+0700 (Western Indonesia Time)
Sometimes Developers may need to perform implementations based on Machine’s Battery and CPU power status. How to collect such information’s quickly ? Don’t know how to do. Don’t worry. MiTec’s System Information Management Suite’s component helps to retrieve such information faster. In this blog post we will learn how to use the TMiTec_APM component to collect power status of your machine with the sample application.
Platforms: Windows.
Installation Steps:
You can easily install this Component Suite from GetIt Package Manager. The steps are as follows.
Navigate In RAD Studio IDE->Tools->GetIt Package Manager->select Components in Categories->Components->Trail -MiTec system Information Component Suite 14.3 and click Install Button.
Read the license and Click Agree All. An Information dialog saying ‘Requires a restart of RAD studio at the end of the process. Do you want to proceed? click yes and continue.
It will download the plugin and installs it. Once installed Click Restart now.
How to run the Demo app:
Navigate to the System Information Management Suite trails setup, Demos folder which is installed during Get It installation e.g) C:UsersDocumentsEmbarcaderoStudio21.0CatalogRepositoryMiTeC-14.3DemosDelphi10
Open the APM project in RAD studio 10.4.1 compile and Run the application.
This Demo App shows how to access the system information like Battery and CPU Power Status.
Components used in MSIC APM Demo App:
TMiTeC_APM: Component to retrieve Machines AC, Processor and Battery Power Status information’s by its properties such as ACPowerStatus, Battery by Battery Index, ProcessorPowerStatus by CPU index.
TTabSheet1 shows the list of AC power status and the selected battery status properties and TTabSheet2 shows the Processor power status properties.
Implementation Details:
An instance is created APM of TMiTeC_APM. Using APM properties Machine AC Power status, Battery related properties such as Manufacturers, Charge status, Battery Life, etc. were added to the TabSheet1 UI components.
procedure TwndMain.cbBatChange(Sender: TObject);
var
s: string;
begin
eBat.Text:='';
eBatCap.Text:='';
eBatRemain.Text:='';
eBatRate.Text:='';
eBatLife.Text:='';
pbBat.Position:=0;
if cbBat.ItemIndex=-1 then
Exit;
with APM.Battery[cbBat.ItemIndex] do begin
if APM.BatteryChargeStatus<>[bsNoBattery] then begin
s:='';
if PowerState and BATTERY_CHARGING=BATTERY_CHARGING then
s:=s+'charging, ';
if PowerState and BATTERY_CRITICAL=BATTERY_CRITICAL then
s:=s+'critical, ';
if PowerState and BATTERY_DISCHARGING=BATTERY_DISCHARGING then
s:=s+'discharging, ';
if PowerState and BATTERY_POWER_ON_LINE=BATTERY_POWER_ON_LINE then
s:=s+'power on-line, ';
SetLength(s,Length(s)-2);
eBat.Text:=s;
eBatMan.Text:=Manufacturer;
eBatChem.Text:=Chemistry;
eBatID.Text:=UniqueID;
eBatLife.Text:=FormatSeconds(EstimatedTime);
if Capacity<>BATTERY_UNKNOWN_CAPACITY then
eBatCap.Text:=Format('%d Wh',[Capacity div 1000])
else
eBatCap.Text:='?';
if Voltage<>BATTERY_UNKNOWN_VOLTAGE then
eBatVolt.Text:=Format('%d V',[Voltage div 1000])
else
eBatVolt.Text:='?';
if CurrentCapacity<>BATTERY_UNKNOWN_CAPACITY then
eBatRemain.Text:=Format('%d Wh',[CurrentCapacity div 1000])
else
eBatRemain.Text:='?';
if Rate<>BATTERY_UNKNOWN_RATE then
eBatRate.Text:=Format('%d W',[Rate div 1000])
else
eBatRate.Text:='?';
pbBat.Max:=Capacity;
pbBat.Position:=CurrentCapacity;
cbBat.Hint:=SymbolicLink;
end else
eBat.Text:='No battery present';
end;
end;
Using APM.ProcessorPowerStatus property provides information such as Max Frequency, Current Frequency, Frequency Limit, etc. for the selected CPU index and were added to the TabSheet2 UI components.
procedure TwndMain.cbCPUChange(Sender: TObject);
begin
if cbCPU.ItemIndex=-1 then
Exit;
with APM.ProcessorPowerStatus[cbCPU.ItemIndex] do begin
eMaxFreq.Text:=Format('%d MHz',[MaxMHz]);
eFreq.Text:=Format('%d MHz',[CurrentMHz]);
eFreqLimit.Text:=Format('%d MHz',[MHzLimit]);
eMaxIdle.Text:=Format('%d',[MaxIdleState]);
eIdle.Text:=Format('%d',[CurrentIdleState]);
if MaxMHz>pbCPU.Max then
pbCPU.Max:=MaxMHz;
pbCPU.Position:=CurrentMHz;
end;
end;
MiTec_APM Demo
It’s that simple to collect the Machines Power status information for your application. Use this MiTeC component suite and get the job done quickly.
Tue Feb 02 2021 09:56:20 GMT+0700 (Western Indonesia Time)
Среди новостей начала этого года было сообщение об объединении компании Apilayer с Idera в рамках объявленной стратегии. Apilayer — компания, которая предоставляет неплохой набор микросервисов для поиска описаний и местоположения, получения данных по курсам валют, погоды и буржевых сводок, сервисы конвертирования и проверки допустимости форматов. Более подробно об этих микросервисах можно прочитать на странице компании https://apilayer.com/. Радует наличие бесплатного доступа к каждому из этих сервисов. Для подключения требуется создать учетную запись на сайте каждого нужного вам сервиса.
Сервисы достаточно просты, имеют подробную документацию с описанием функций и параметров вызова REST API.
Здесь мне хотелось бы показать, насколько просто и быстро можно подключить эти сервисы в ваши программы на Delphi или С++. Для примера возьмем сервис получения данных о погоде https://weatherstack.com/, ограниченные функции которого можно использовать бесплатно.
Я заранее создал учетную запись и получил персональный ключ доступа приложения к сервису. Это каждый вполне осилит самостоятельно.
Давайте создадим новый проект Delphi. Для этого примера я буду использовать фреймворк FMX, и приложение можно будет использовать на Android. Но сначала надо освоить API и подобрать нужные параметры. Это проще всего сделать в инструменте REST Debugger из поставки Delphi: он вызывается прямо из меню Tools в главном меню IDE. Указываем URL для точки входа API — https://api.weatherstack.com и метод GET, затем, на закладке Parameters, функцию current в поле Resource. Теперь надо задать параметры вызова, из которых access_key является обязательным. Локация/регион/город для получения данных о погоде указывается во втором параметре — query. Установить Content-Type для приема JSON, и осталось только нажать кнопку Send Request для получения результата. Если все верно, то результат будет таким:
Проект приложения будет состоять из одной формы, на которой помещены: верхняя панель с TLabel, TEdit для ввода локации и TSpeedButton (стиль refreshtoolbutton), а также TTabControl с двумя закладками: JSON и Data, на которые поместим TMemo и Tlistbox, соответственно.
Чтобы организовать доступ к REST API из приложения, достаточно в REST Debugger нажать кнопку CopyComponents — все необходимое будет скопировано в буфер обмена — и затем сделать Edit->Paste на форму приложения в IDE, для простоты — на главную. Появится пять компонент со свойствами, уже установленными в нужные и отлаженные параметры. Это RESTClient, RESTRequest, RESTResponse, RESTResponceDatasetAdapter и FDMemTable. Первые три отвечают за REST вызов и получение Response, а адаптер преобразует json-данные в dataset. Прямо во время проектирования можно вызвать Request.Execute компонента RESTRequest и проверить результат на экране.
Осталось связать полученные данные с компонентами для показа пользователю приложения во время выполнения. Это потребует минимум кода: обработка события нажатия кнопки и загрузка табличных данных из dataset в Listbox. Отображения json-результата в TMemo на первой закладке проще всего сделать через Visual LiveBindings и это не потребует написания ни строчки кода.
procedure TForm4.FillData;
//var
// ListBoxItem: TListBoxItem;
begin
ListBox1.BeginUpdate;
try
ListBox1.Items.Clear;
for var F in FDMemTable1.Fields do
begin
ListBox1.Items.AddPair(F.DisplayName, F.asString);
//ListBoxItem := TListBoxItem.Create(ListBox1);
//ListBoxItem.Text := Format('%s = %s', [F.DisplayName, F.AsString]);
//ListBox1.AddObject(ListBoxItem);
end;
finally
ListBox1.EndUpdate;
end;
end;
procedure TForm4.SpeedButton1Click(Sender: TObject);
begin
if Edit1.Text <> '' then begin
RESTRequest1.Params.ParameterByName('query').Value := Edit1.Text;
RESTRequest1.Execute;
FillData;
end;
end;
В процедуре SpeedButton1Click вызов производится только, если в Edit1 было введено имя местности. Это имя заносится в параметр query, выполняется обращение к сервису, а в процедуре FillData полученными в FDMemTable1 данными заполняется LIistBox1. Первоначально все было сделано по классике (закомментировано в примере кода), а потом выяснилось, что можно обойтись одно строчкой с вызовом другого метода.
Результаты запуска после компиляции можно увидеть на картинках ниже.
Другие микросервисы Apilayer вызываются аналогично, некоторые еще проще.
Mon Feb 01 2021 23:20:07 GMT+0700 (Western Indonesia Time)
MetroDrummer ist eine leistungsstarke Drum-Machine-App für Android und iOS und wurde in Delphi entwickelt. Sie bietet „12 Rhythmus-Sektionen mit der Möglichkeit, bis zu 24 Rhythmen für jede Sektion hochzuladen“ und eine „Benutzer-Sektion, in der Sie Ihre Lieblingsrhythmen mit Tempowechsel und stummen Drum-Parts speichern können“ sowie die Möglichkeit, „ein beliebiges Tempo von 40 (largo) bis 300 Beats pro Minute (prestissimo) als echtes Metronom zu wählen.“ Außerdem bietet es Rhythmusfunktionen wie Start/Stop, Intro, Standard, Variation, Fill to Standard, Fill to Variation, Percussion und Ending. Außerdem können Sie „ein beliebiges Tempo von 40 (largo) bis 300 Beats pro Minute (prestissimo) als echtes Metronom wählen.“ Insgesamt ist MetroDrummer ein gutes Beispiel für die plattformübergreifenden Fähigkeiten von Delphi.
Mon Feb 01 2021 23:18:52 GMT+0700 (Western Indonesia Time)
Иногда вашему приложению требуется пользовательский интерфейс, но как лучше всего сделать его для приложений Python? Введите DelphiVCL для Python. VCL — это зрелая среда графического пользовательского интерфейса Windows с огромной библиотекой включенных визуальных компонентов и надежной коллекцией сторонних компонентов. Это лучшая среда для собственных приложений Windows, но как использовать ее с Python? Благодаря пакету Python DelphiVCL VCL представляет собой первоклассный пакет для создания собственных графических интерфейсов Windows с помощью Python. Нужны дополнительные инструменты для дизайна? Вы можете создать весь графический интерфейс в Delphi, а затем написать всю логику на Python. DelphiVCL — это самая быстрая, наиболее продуманная и полная библиотека графического интерфейса для разработки собственного графического интерфейса Windows Python.
Mon Feb 01 2021 23:18:36 GMT+0700 (Western Indonesia Time)
Às vezes, seu aplicativo precisa de uma interface de usuário, mas qual é a melhor maneira de fazer uma para aplicativos Python? Digite DelphiVCL para Python. A VCL é uma estrutura GUI nativa do Windows madura com uma enorme biblioteca de componentes visuais incluídos e uma coleção robusta de componentes de terceiros. É a estrutura principal para aplicativos nativos do Windows, mas como usá-la com Python? Graças ao pacote DelphiVCL Python, o VCL é um pacote de primeira classe para construir GUIs nativos do Windows com Python. Precisa de mais ferramentas de design? Você pode construir a GUI inteira em Delphi e então escrever toda a lógica em Python. DelphiVCL é a biblioteca GUI mais rápida, madura e completa para o desenvolvimento de GUI Windows Python nativa.
Mon Feb 01 2021 23:18:06 GMT+0700 (Western Indonesia Time)
A veces, su aplicación necesita una interfaz de usuario, pero ¿cuál es la mejor manera de crear una para las aplicaciones de Python? Ingrese DelphiVCL para Python. La VCL es un marco GUI nativo de Windows maduro con una enorme biblioteca de componentes visuales incluidos y una colección sólida de componentes de terceros. Es el marco principal para aplicaciones nativas de Windows, pero ¿cómo usarlo con Python? Gracias al paquete DelphiVCL Python, la VCL es un paquete de primera clase para construir GUI nativas de Windows con Python. ¿Necesitas más herramientas de diseño? Puede construir la GUI completa en Delphi y luego escribir toda la lógica en Python. DelphiVCL es la biblioteca de GUI más rápida, madura y completa para el desarrollo de GUI nativo de Windows Python.
Mon Feb 01 2021 23:17:44 GMT+0700 (Western Indonesia Time)
Manchmal braucht Ihre Anwendung eine Benutzeroberfläche, aber wie kann man diese am besten für Python-Anwendungen erstellen? Hier kommt DelphiVCL für Python ins Spiel. Die VCL ist ein ausgereiftes natives Windows-GUI-Framework mit einer riesigen Bibliothek mitgelieferter visueller Komponenten und einer robusten Sammlung von Drittanbieterkomponenten. Es ist das führende Framework für native Windows-Anwendungen, aber wie kann man es mit Python verwenden? Dank des DelphiVCL Python-Pakets ist die VCL ein erstklassiges Paket für die Erstellung nativer Windows-GUIs mit Python. Brauchen Sie mehr Design-Werkzeuge? Sie können die gesamte GUI in Delphi erstellen und dann die gesamte Logik in Python schreiben. DelphiVCL ist die schnellste, ausgereifteste und vollständigste GUI-Bibliothek für native Windows-Python-GUI-Entwicklung.
Mon Feb 01 2021 17:00:19 GMT+0700 (Western Indonesia Time)
An emerging trend in digital transformation efforts has been the rise of low-code development platforms. Of course, these low-code platforms must be grounded in best-of-breed governance capabilities which include security and compliance features. Without strong governance, the full benefits of low-code development cannot be realized. It’s only natural that any low-code platform chosen by an organization must have strong security and compliance capabilities. Microsoft has developed the Power Platform which includes Power Apps, Power Automate, Power Virtual Agents, and Power BI to serve our customer’s needs for a robust low-code development platform that includes app development, automation, chatbots, and rich, detailed data analysis and visualization. We previously reported on the fundamental security and compliance capabilities offered with Microsoft Flow which was renamed Power Automate. In this blog, we’re going to discuss the integrated security and compliance capabilities across the Power Platform and provide an update on the new capabilities we’ve launched.
Foundations of governance
As the number of developers grows, governance becomes a key criterion to ensure digital transformation. As such, IT must create stronger guardrails to ensure the growing numbers of developers and the assets they create all remain compliant and secure. The Power Platform’s governance approach is multi-step with a focus on security, monitoring, administrative management, and application lifecycle management (figure 1). Check out our detailed governance and administration capabilities. The Power Platform also offers a Center of Excellence Starter Kit which organizations can use to evolve and educate employees on governance best practices. The Power Platform comes equipped with features that help reduce the complexity of governing your environment and empowers admins to unlock the greatest benefits from their Power Platform services. We’re reporting some of our newest capabilities to protect your organization’s data with tenant restrictions and blocking email exfiltration. We’re also announcing new analytics reports available for the robotic process automation (RPA) capability recently launched with Power Automate.
Figure 1: The Power Platform multi-step governance strategy.
Cross-tenant inbound and outbound restrictions using Azure Active Directory
The Power Platform offers access to over 400 connectors to today’s most popular enterprise applications. Connectors are proxies or wrappers around an API that allows the underlying service to ‘talk’ to Power Automate, Power Apps, and Azure Logic Apps. Control and access to these connectors and the data residing in the applications is a crucial aspect of a proactive governance and security approach. To this end, we have recently enhanced the cross-tenant inbound and outbound restrictions for Power Platform connectors. The Power Platform leverages Azure Active Directory (Azure AD) for controlling user authentication and access to data for important connectors such as Microsoft first-party services. While tenant restrictions can be created with Azure AD all up, enabling organizations to control access to software as a service (SaaS) cloud applications and services based on the Azure AD tenant used for single sign-on, they cannot target specific Microsoft services such as Power Platform exclusively. Organizations can opt to isolate the tenant for Azure AD-based connectors exclusively for Power Platform, using Power Platform’s tenant isolation capability. Power Platform tenant isolation works for connectors using Azure AD-based authentication such as Office 365 Outlook or SharePoint. Power Platform’s tenant isolation can be one way or two way depending on the specific use case. Tenant admins can also choose to allow one or more specific tenants in inbound or outbound direction for connection establishment while disallowing all other tenants. Learn more about tenant restrictions and tenant isolation. For now, this capability is available through support and will soon be available for admin self-service using Power Platform admin center.
In addition to leveraging Power Platform tenant isolation’s ability to prevent data exfiltration and infiltration for Azure AD-based connectors, admins can safeguard against connectors using external identity providers such as Microsoft account, Google, and much more—creating a data loss prevention policy that classifies the connector under the Blocked group.
Email exfiltration controls
Digital transformation has opened a variety of new communications channels. However, email remains the foundational method of digital communication and Microsoft Outlook continues as one of the dominant email services for enterprises. Preventing the exfiltration of sensitive data via email is crucial to maintaining enterprise data security. To this end, we have added the ability for Power Platform admins to prevent emails sent through Power Platform to be distributed to external domains. This is done by setting Exchange mail rules based on specific SMTP headers that are inserted in emails sent through Power Automate and Power Apps using the Microsoft 365 Exchange and Outlook connector. The SMTP headers can be used to create appropriate exfiltration (unauthorized transfer of data from one device to another) rules in Microsoft Exchange for outbound emails. For more details on these headers auto-inserted through Microsoft 365 Outlook connector, see SMTP headers. With the new controls, admins can easily block the exfiltration of forwarded emails and exempt specific flows (automated workflow created with Power Automate) or apps from exfiltration blocking. To block the exfiltration of forwarded emails, admins can set up Exchange mail flow rules to monitor or block emails sent by Power Automate and or Power Apps using the Microsoft 365 Outlook connector. Figure 2 is an example SMTP header for an email sent using Power Automate with the reserved word ‘Power Automate’ in the application header type.
Figure 2: Power Platform SMTP email header with reserved word ‘Power Automate.’
The SMTP header also includes the operation ID includes the type of email, which in figure 2 is a forwarded email. Exchange admins can use these headers to set up exfiltration blocking rules in the Exchange admin center. As you can see in figure 2, the SMTP header also includes a workflow identifier as the new ‘User-Agent’ header which is equal to the app or flow ID. Admins can exempt some flows (or apps) from the exfiltration due to the business scenario or use the workflow ID as part of the user-agent header to do the same. Learn more about how Power Platform helps admins prevent email exfiltration with these sophisticated new controls.
Powerful analytics for monitoring robotic process automation processes
One of the most exciting new capabilities offered with the Power Platform is Desktop Flows (previously known as UI flows) which provide robotic process automation (RPA) available through Power Automate. Along with this powerful new feature, we have launched new analytics dashboards to ensure admins have full visibility with new RPA processes. Admins can view the overall status of automation that runs in the organization and monitor the analytics for automation that’s built with RPA automation from the Power Platform admin center. These analytics reports are accessible to users granted environment admin privilege. Admins can access the Power Platform admin center by clicking the Admin Center from the Power Automate portal settings menu. From the admin center, admins can access either Cloud flows (non-RPA automation) or Desktop flows. The Desktop flows page offers three types of reports:
Runs: Gives you an overview of daily, weekly, and monthly desktop flows run statics.
Usage: Usage of the different RPA processes.
Created: Analytics for recently created RPA processes.
Figure 3 shows an example of the new Runs report available in the admin center for Desktop flows. You can get more details on these powerful new analytics capabilities from our Microsoft docs page and our announcement blog. Check them both out.
Figure 3: New analytics ‘Run’ report for Desktop flows in Power Platform admin center.
Join our community and get started today
Join the growing Power Platform community so you can get the latest updates, join discussions, and get ideas on how the Power Platform can help your organization. You can also learn how the products work from these learning modules available at Microsoft Learn. Be sure to check out some of our great assets which will get you more knowledgeable about the powerful tools available to ensure your organization benefits from low-code development with the Power Platform while adhering to some of the industry’s best compliance and security standards.
To learn more about Microsoft Security solutions, visit our website. Bookmark the Security blog to keep up with our expert coverage on security matters. Also, follow us at @MSFTSecurity for the latest news and updates on cybersecurity.
Mon Feb 01 2021 17:00:06 GMT+0700 (Western Indonesia Time)
From March to December 2020, we tracked segments of a dynamically generated email infrastructure that attackers used to send more than a million emails per month, distributing at least seven distinct malware families in dozens of campaigns using a variety of phishing lures and tactics. These campaigns aimed to deploy malware on target networks across the world, with notable concentration in the United States, Australia, and the United Kingdom. Attackers targeted the wholesale distribution, financial services, and healthcare industries.
By tracing these campaigns, we uncovered a sprawling infrastructure that is robust enough to seem legitimate to many mail providers, while flexible enough to allow the dynamic generation of new domain names and remain evasive. Shared IP space, domain generation algorithm (DGA) patterns, subdomains, registrations metadata, and signals from the headers of malicious emails enabled us to validate our research through overlaps in campaigns where attackers utilized multiple segments of purchased, owned, or compromised infrastructure. Using the intelligence we gathered on this infrastructure, we were at times able to predict how a domain was going to be used even before campaigns began.
This email infrastructure and the malware campaigns that use it exemplify the increasing sophistication of cybercriminal operations, driven by attackers who are motivated to use malware infections for more damaging, potentially more lucrative attacks. In fact, more recent campaigns that utilized this infrastructure distributed malware families linked to follow-on human-operated attacks, including campaigns that deployed Dopplepaymer, Makop, Clop, and other ransomware families.
Our deep investigation into this infrastructure brings to light these important insights about persistent cybercriminal operations:
Tracking an email infrastructure surfaces patterns in attacker activity, bubbling up common elements in seemingly disparate campaigns
Among domains that attackers use for sending emails, distributing malware, or command-and-control, the email domains are the most likely to share basic registration similarities and more likely to use DGA
Malware services rely on proxy providers to make tracking and attribution difficult, but the proxies themselves can provide insights into upcoming campaigns and improve our ability to proactively protect against them
Gaining intelligence on email infrastructures enables us to build or improve proactive and comprehensive protections like those provided by Microsoft Defender for Office 365 to defend against some of the world’s most active malware campaigns
While there is existing in-depth research into some of these specific campaigns, in this blog we’ll share more findings and details on how email distribution infrastructures drive some of the most prevalent malware operations today. Our goal is to provide important intelligence that hosting providers, registrars, ISPs, and email protection services can use and build on to protect customers from the threats of today and the future. We’ll also share insights and context to empower security researchers and customers to take full advantage of solutions like Microsoft Defender for Office 365 to perform deep investigation and hunting in their environment and make their organizations resilient against attacks.
The role of for-sale infrastructure services in the threat ecosystem
We spotted the first segment of the infrastructure in March, when multiple domains were registered using distinct naming patterns, including the heavy use of the word “strange”, inspiring the name StrangeU. In April, a second segment of the infrastructure, one that used domain generation algorithm (DGA), began registration as well. We call this segment RandomU.
The emergence of this infrastructure in March dovetailed with the disruption of the Necurs botnet that resulted in the reduction of service. Before being disrupted, Necurs was one of the world’s largest botnets and was used by prolific malware campaign operators such as those behind Dridex. For-sale services like Necurs enable attackers to invest in malware production while leasing the delivery components of their activities to further obfuscate their behavior. The StrangeU and RandomU infrastructure appear to fill in the service gap that the Necurs disruption created, proving that attackers are highly motivated to quickly adapt to temporary interruptions to their operations.
Figure 1. Timeline of staging and utilization of the email infrastructure
At first, the new email infrastructure was used infrequently in campaigns that distributed highly commodity malware like Mondfoxia and Makop. Soon, however, it attracted the attention of Dridex and Trickbot operators, who began using the infrastructure for portions of their campaigns, sometimes entirely and sometimes mixed with other compromised infrastructure or email providers.
Analyzing these mail clusters provides insight into how human the tangled web of modular attacker infrastructure remains. From unifying key traits in registration and behavior to the simple and effective techniques that the wide variety of malware uses, attackers’ goals in this diversification point toward combatting automated analysis. However, these same shared characteristics and methods translate to insights that inform resilient protections that defend customers against these attacks.
Domain registration and email infrastructure staging
On March 7, 2020, attackers began registering a series of domains with Namecheap using sets of stolen email addresses, largely from free email services like mail.com, mail.ru, list.ru, and others. These domains all had similar characteristics that could be linked back to various similarities in registration. Almost all of the registered domains contained the word “strange” and were under the .us TLD, hence the name StrangeU. The use of .us TLD prevented domain or WHOIS privacy services—often used to obfuscate domain ownership and provenance—which are prohibited for this TLD.
To circumvent tracking and detection of these domains, attackers used false registration metadata. However, there was heavy crossover in the fake names and email addresses, allowing us to find additional domain names, some of which could be tied together using other keywords as shown in the list below, and fingerprint the domain generation mechanism.
The StrangeU domains were registered in early March 2020 and operated in continuous small bursts until April, when they were used for a large ransomware campaign. Following that, a new campaign occurred fairly regularly every few weeks. Registration of new domains continued throughout the year, and in September, the StrangeU infrastructure was used in conjunction with a similar infrastructure to deliver Dridex, after which these domains were used less frequently.
This second mailing segment, RandomU, employed a different DGA mechanism but still utilized Namecheap and showed a more consistent through line of registration metadata than its StrangeU counterpart. This infrastructure, which surfaced in April, was used infrequently through the Spring, with a surge in May and July. After the Dridex campaign in September in which it was used along with StrangeU, it has been used in two large Dridex campaigns every month.
Figure 2. Common patterns in domains belonging to the email infrastructure
The StrangeU and RandomU segments of domains paint a picture of supplementing modular mailing services that allowed attackers to launch region-specific and enterprise-targeting attacks at scale, delivering over six million emails. The two segments contained a standard barrage of mailing subdomains, with over 60 unique subdomains referencing email across clusters, consistent with each other, with each domain having four to five subdomains. The following is a sample of malware campaigns, some of which we discuss in detail in succeeding sections, that we observed this infrastructure was used for:
Korean spear-phishing campaigns that delivered Makop ransomware in April and June
Emergency alert notifications that distributed Mondfoxia in April
Black Lives Matter lure that delivered Trickbot in June
Dridex campaign delivered through StrangeU and other infra from June to July
Dofoil (SmokeLoader) campaign in August
Emotet and Dridex activities in September, October, and November
Figure 3. Timeline of campaigns that used StrangeU and RandomU domains
Korean spear-phishing delivers Makop ransomware (April and June 2020)
In early April, StrangeU was used to deliver the Makop ransomware. The emails were sent to organizations that had major business operations in Korea and used names of Korean companies as display names. Signals from Microsoft Defender for Office 365 indicated that these campaigns ran in short bursts.
The emails had .zip attachments containing executables with file names that resembled resumes from job seekers. Once a user opened the attachments, the executables delivered Makop, a ransomware-as-a-service (RaaS) payload that targeted devices and backups.
Upon infection, the malware quickly used the WMI command-line (WMIC) utility and deleted shadow copies. It then used the BCEdit tool and altered the boot configuration to ignore future failures and prevent restoration before encrypting all files and renaming them with .makop extensions.
The second time we observed the campaign almost two months later, in early June, the attackers used a Makop ransomware variant with many modified elements, including added persistence via scripts in the Startup folder before triggering a reboot.
Nearly identical attempts to deliver Makop using resume-based lures were covered by Korean security media during the entire year, using popular mail services through legitimate vendors like Naver and Hanmail. This could indicate that during short bursts the Makop operators were unable to launch their campaigns through legitimate services and had to move to alternate infrastructures like StrangeU instead.
Black Lives Matter lure delivers Trickbot (June 2020)
One campaign associated with the StrangeU infrastructure gained notoriety in mid-June for its lure as well as for delivering the notorious info-stealing malware Trickbot. This campaign circulated emails with malicious Word documents claiming to seek anonymous input on the Black Lives Matter movement.
An initial version of this campaign was observed on June 10 sending emails from a separate, unique attacker-owned mailing infrastructure using .monster domains. However, in the next iteration almost two weeks later, the campaign delivered emails from various domains specifically created with the Black Lives Matter signage, interspersed with StrangeU domains:
b-lives-matter[.]site
blivesm[.]space
blivesmatter[.]site
lives-matter-b[.]xyz
whoslivesmatter[.]site
lives-m-b[.]xyz
ereceivedsstrangesecureworld[.]us
b-l-m[.]site
Both campaigns carried the same Trickbot payload, operated for two days, and used identical post-execution commands and callouts to compromised WordPress sites.
Once a user opened the document attachment and enabled the malicious macro, Word launched cmd.exe with the command “/c pause” to evade security tools that monitored for successive launches of multiple processes. It then launched commands that deleted proxy settings in preparation for connecting to multiple C2 IP addresses.
Figure 4. Screenshot of the malicious document used to deliver Trickbot
The commands also launched rundll32.exe, a native binary commonly used as a living-off-the-land binary, to load a malicious file in memory. The commandeered rundll32.exe alsoproceeded to perform other tasks using other living-off-the-land binaries, including wermgr.exe and svchost.exe.
In turn, the hijacked wermgr.exe process dropped a file with a .dog extension that appeared to be the Trickbot payload. The same instance of wermgr.exe then appeared to inject code into svchost.exe and scanned for open SMB ports on other devices. The commandeered svchost.exe used WMI to open connections to additional devices on the network, while continuing to collect data from the initial infected device. It also opened multiple browsers on localhost connections to capture browser history and other information via esentutl.exe and grabber_temp.edb, both of which are often used by the Trickbot malware family.
This campaign overwhelmingly targeted corporate accounts in the United States and Canada and avoided individual accounts. Despite heavy media coverage, this campaign was relatively small, reflecting a common behavior among cybercrime groups, which often run multiple, dynamic low-volume campaigns designed to evade resilient detection.
Dridex campaigns big and small (June to July 2020 and beyond)
From late June through July, Dridex operators ran numerous campaigns that distributed Excel documents with malicious macros to infect devices. These operators first delivered emails through the StrangeU infrastructure only, but they quickly started to use compromised email accounts of legitimate organizations as well, preventing defenders from easily blocking deliveries. Despite this, emails from either StrangeU or the compromised accounts had overlapping attributes. For example, many of the emails used the same ReplyTo addresses that were sourced from compromised individual accounts and not consistent with the sender addresses.
During the bulk of this run, Excel files were attached directly in the email in order to eventually pull the Dridex payload from .xyz domains such as those below. The attackers changed the delivery domains every few days and connected to IP-based C2s on familiar ports like 4664, 3889, 691, and 8443:
yumicha[.]xyz
rocesi[.]xyz
secretpath[.]xyz
guruofbullet[.]xyz
Greyzone[.]xyz
When opened, the Excel document installed one of a series of custom Dridex executables downloaded from the attacker C2 sites. Like most variants in this malware family, the custom Dridex executables incorporated code loops, time delays, and environment detection mechanisms that evaded numerous public and enterprise sandboxes.
Dridex is known for its capability to perform credential theft and establish connectivity to attacker infrastructure. In this instance, the same Dridex payload was circulated daily using varying lures, often repeatedly to the same organizations to ensure execution on target networks.
During the longer and more stable Excel Dridex campaigns in June and July, a Dridex variant was also distributed in much smaller quantities utilizing Word documents over a one-day period, perhaps testing new evasion techniques. These Word documents, while still delivering Dridex, improved existing obfuscation methods using a unique combination of VBA stomping and replacing macros and function calls with arbitrary text. In a few samples of these documents, we found text from Shakespearean prose.
</ms:script>
var farewell_and_moon = ["m","a","e","r","t","s",".","b","d","o","d","a"].reverse().join("")
a_painted_word(120888)
function as_thy_face(takes_from_hamlet)
{return new ActiveXObject(takes_from_hamlet)}
</ms:script>
While Microsoft researchers didn’t observe this portion of the campaign moving into the human-operated phase—targets did not open the attachment—this campaign was likely to introduce tools like PowerShell Empire or Cobalt Strike to steal credentials, move laterally, and deploy ransomware.
Emotet, Dridex, and the RandomU infrastructure (September and beyond)
Despite an errant handful of deliveries distributing Dofoil (also known as SmokeLoader) and other malware, the vast majority of the remaining deliveries through StrangeU have been Dridex campaigns that reoccured every few weeks for a handful of days at a time. These campaigns started on September 7, when RandomU and StrangeU were notably used in a single campaign, after which StrangeU began to see less utilization.
These Dridex campaigns utilized an Emotet loader and initial infrastructure for hosting, allowing the attackers to conduct a highly modular email campaign that delivered multiple distinct links to compromised domains. These domains employed heavy sandbox evasion and are connected by a series of PHP patterns ending in a small subset of options: zxlbw.php, yymclv.php, zpsxxla.php, or app.php. As the campaigns continued, the PHP was dynamically generated, adding other variants, including vary.php, invoice.php, share.php, and many others. Some examples are below.
In this campaign, sandboxes were frequently redirected to unrelated sites like chemical manufacturers or medical suppliers, while users received an Emotet downloader within a Word document, which once again used macros to facilitate malicious activities.
Figure 5. Screenshot of the malicious document used to deliver Dridex
The malicious macro utilized WMI to run a series of standard PowerShell commands. First, it downloaded the executable payload itself by contacting a series of C2 domains associated with Emotet campaigns since July. Afterward, additional encoded PowerShell commands were used in a similar fashion to download a .zip file that contained a Dridex DLL. Additional commands also reached out to a variety of Emotet infrastructure hosted on compromised WordPress administrative pages, even after the Dridex payload has already been downloaded. Dridex then modified RUN keys to automatically start the Dridex executable, which was renamed to riched20.exe on subsequent logons.
We also observed simultaneous connections to associated Dridex and Emotet infrastructure. These connections were largely unencrypted and occurred over a variety of ports and services, including ports 4664 and 9443. At this point the malware had firm presence on the machine, enabling attackers to perform human-operated activity at a later date.
In the past, reports have confirmed Dridex being delivered via leased Emotet infrastructure. There have also been many IP and payload-based associations. This research adds to that body of work and confirms additional associations via namespace, as well as correlation of email lure, metadata, and sender. This iteration of campaign repeated through October to December largely unchanged with nearly identical mails.
Defending organizations against malware campaigns
As attacks continue to grow in modularity, the tactics that attackers use to deliver phishing email, gain initial access on systems, and move laterally will continuously become more varied. This research shows that despite these disparities and the increased resiliency attackers have built, the core tactics and tools that they use are still limited in scope, relying repeatedly on familiar malicious macros, lures, and sending tactics.
Sweeping research into massive attacker infrastructures, as well as our real-time monitoring of malware campaigns and attacker activity, directly inform Microsoft security solutions, allowing us to build or improve protections that block malware campaigns and other email threats, both current and future, as well as provide enterprises with the tools for investigating and responding to email campaigns in real-time.
Microsoft delivers these capabilities through Microsoft Defender for Office 365. Features likes Safe attachments and Safe links ensure real-time, dynamic protection against email campaigns no matter the lure or evasion tactic. These features use a combination of detonation, automated analysis, and machine learning to detect new and unknown threats. Meanwhile, the Campaign view shows the complete picture of email campaigns as they happen, including timelines, sending patterns, impact to the organization, and details like IP addresses, senders, and URLs. These insights into email threats empower security operations teams to respond to attacks, perform additional hunting, and fix configuration issues.
Armed with an advanced solution like Microsoft Defender for Office 365 and the rest of technologies in the broader Microsoft 365 Defender solution, enterprises can further increase resilience against threats by following these recommendations:
Educate end users about protecting personal and business information in social media, filtering unsolicited communication, identifying lures in spear-phishing email, and reporting of reconnaissance attempts and other suspicious activity.
Check perimeter firewall and proxy to restrict servers from making arbitrary connections to the internet to browse or download files. Turn on network protection to block connections to malicious domains and IP addresses. Such restrictions help inhibit malware downloads and command-and-control activity.
Turning on attack surface reduction rules, including rules that can block advanced macro activity, executable content, process creation, and process injection initiated by Office applications, also significantly improves defenses. The following rules are especially useful in blocking the techniques observed in campaigns using the StrangeU and RandomU infrastructure:
Microsoft 365 customers can also use the advanced hunting capabilities in Microsoft 365 Defender, which integrates signals from Microsoft Defender for Office 365 and other solutions, to locate activities and artifacts related to the infrastructure and campaigns discussed in this blog. These queries can be used with advanced hunting in Microsoft 365 security center, but the same regex pattern can be used on other security tools to identify or block emails.
This query searches for emails sent from StrangeUemail addresses. Run query
EmailEvents
| where SenderMailFromDomain matches regex @"^(?:eraust|ereply|reply|ereceived|received|reaust|esend|inv|send|emailboost|eontaysstrange|eprop|frost|eont|servicply).*(strange|stange|emailboost).*\.us$"
or SenderFromDomain matches regex @"^(?:eraust|ereply|reply|ereceived|received|reaust|esend|inv|send|emailboost|eontaysstrange|eprop|frost|eont|servicply).*(strange|stange|emailboost).*\.us$"
Mon Feb 01 2021 16:42:01 GMT+0700 (Western Indonesia Time)
Do you need to Monitor Devices in your Machine from your Delphi Application? Don’t know where to start with ? Don’t worry. MiTec’s System Information Management Suite’s component helps to monitor your USB, Bluetooth devices or TV/monitor connection/disconnection, volumes mount/unmount, CD/DVD insert/eject with less code and we will learn how to use MiTeC_DeviceMonitor in this blog post.
Platforms: Windows.
Installation Steps:
You can easily install this Component Suite from GetIt Package Manager. The steps are as follows.
Navigate In RAD Studio IDE->Tools->GetIt Package Manager->select Components in Categories->Components->Trail -MiTec system Information Component Suite 14.3 and click Install Button.
Read the license and Click Agree All. An Information dialog saying ‘Requires a restart of RAD studio at the end of the process. Do you want to proceed? click yes and continue.
It will download the plugin and installs it. Once installed Click Restart now.
How to run the Demo app:
Navigate to the System Information Management Suite trails setup, Demos folder which is installed during Get It installation e.g) C:UsersDocumentsEmbarcaderoStudio21.0CatalogRepositoryMiTeC-14.3DemosDelphi8
Open the DeviceMonitor project in RAD studio 10.4.1 compile and Run the application.
This Demo App shows how to monitor the USB Devices, Storage Devices upon connection and disconnection to your machine.
Components used in MSIC DeviceMonitor App:
TMiTeC_DeviceMonitor: Catches USB, Bluetooth devices or TV/monitor connection/disconnection, volumes mount/unmount, CD/DVD insert/eject and other events from other devices. It has events such as OnDeviceConnect, OnDeviceDisconnect, OnMessage, OnVolumeConnect, OnVolumeDisconnect to monitor the devices.
TListBox to list the event messages upon device gets connected and disconnected other message notifications.
TMemo to highlight the line from the list box separately for easy reading.
TButton to save/clear the messages in the list box and for closing.
Implementation Details:
An instance DeviceMonitor of TMiTeC_DeviceMonitor is created. During DeviceMonitorDeviceConnect, it identifies the device desc class by matching the GUID and logs the message according to the device connected.
procedure Twnd_dm_Main.DeviceMonitorDeviceConnect(Sender: TObject;
DeviceDesc: TDeviceDesc);
var
t: Integer;
g: TGUID;
begin
if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_USB_DEVICE)) then
g:=GUID_DEVCLASS_USB
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_DISK)) then
g:=GUID_DEVCLASS_DISKDrive
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_WPD)) then
g:=GUID_DEVCLASS_WPD
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_REMOVABLE_STORAGE)) then
g:=GUID_DEVCLASS_FDC
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_VOLUME)) then
g:=GUID_DEVCLASS_VOLUME
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_BLUETOOTH)) then
g:=GUID_DEVCLASS_BLUETOOTH
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_NET)) then
g:=GUID_DEVCLASS_NET
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_MOUSE)) then
g:=GUID_DEVCLASS_MOUSE
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_KEYBOARD)) then
g:=GUID_DEVCLASS_KEYBOARD
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_DISPLAY_ADAPTER)) then
g:=GUID_DEVCLASS_DISPLAY
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_MONITOR)) then
g:=GUID_DEVCLASS_MONITOR
else
g:=StringToGUID(DeviceDesc.GUID);
//AddLog('GUID: '+DeviceDesc.GUID);
SetupDiGetClassImageIndex(spid,g,t);
if DeviceDesc.Name<>'' then
AddLog(Format('%s (%s) connected.',[DeviceDesc.Location,DeviceDesc.Name]),t)
else if DeviceDesc.Description<>'' then
AddLog(Format('%s (%s) connected.',[DeviceDesc.Location,DeviceDesc.Description]),t)
else if DeviceDesc.SymbolicName<>'' then
AddLog(Format('Device (%s) connected.',[ExtractFilename(Uppercase(DeviceDesc.SymbolicName))]),t)
else
AddLog('Device connected.',t);
end;
Upon disconnecting, it identifies the device desc class by matching the GUID and logs the message according to the device disconnected.
procedure Twnd_dm_Main.DeviceMonitorDeviceDisconect(Sender: TObject;
DeviceDesc: TDeviceDesc);
var
t: Integer;
g: TGUID;
begin
if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_USB_DEVICE)) then
g:=GUID_DEVCLASS_USB
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_DISK)) then
g:=GUID_DEVCLASS_DISKDRIVE
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_WPD)) then
g:=GUID_DEVCLASS_WPD
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_REMOVABLE_STORAGE)) then
g:=GUID_DEVCLASS_FDC
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_VOLUME)) then
g:=GUID_DEVCLASS_VOLUME
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_BLUETOOTH)) then
g:=GUID_DEVCLASS_BLUETOOTH
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_NET)) then
g:=GUID_DEVCLASS_NET
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_MOUSE)) then
g:=GUID_DEVCLASS_MOUSE
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_KEYBOARD)) then
g:=GUID_DEVCLASS_KEYBOARD
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_DISPLAY_ADAPTER)) then
g:=GUID_DEVCLASS_DISPLAY
else if SameText(DeviceDesc.GUID,GUIDToString(GUID_DEVINTERFACE_MONITOR)) then
g:=GUID_DEVCLASS_MONITOR
else
g:=StringToGUID(DeviceDesc.GUID);
//AddLog('GUID: '+DeviceDesc.GUID);
SetupDiGetClassImageIndex(spid,g,t);
if DeviceDesc.Name<>'' then
AddLog(Format('%s (%s) disconnected.',[DeviceDesc.Location,DeviceDesc.Name]),t)
else if DeviceDesc.Description<>'' then
AddLog(Format('%s (%s) disconnected.',[DeviceDesc.Location,DeviceDesc.Description]),t)
else if DeviceDesc.SymbolicName<>'' then
AddLog(Format('Device (%s) disconnected.',[DeviceDesc.SymbolicName]),t)
else
AddLog('Device disconnected.',t);
end;
To monitor device custom event messages,
procedure Twnd_dm_Main.DeviceMonitorMessage(Sender: TObject;
Msg: TMessage);
var
m,d: string;
begin
if not cbxAll.Checked then
Exit;
m:=GetMessageType(Msg.wParam);
case Msg.wParam of
DBT_DEVICEARRIVAL..DBT_CUSTOMEVENT: begin
d:=GetDeviceType(PDevBroadcastHdr(Msg.lParam).dbch_devicetype);
case PDevBroadcastHdr(Msg.lParam).dbch_devicetype of
DBT_DEVTYP_OEM,
DBT_DEVTYP_DEVNODE,
DBT_DEVTYP_PORT: AddLog(Format('*%s: %s',[m,d]));
DBT_DEVTYP_VOLUME: AddLog(Format('*%s: %s - 0x%x - 0x%x',[m,d,
PDevBroadcastVolume(Msg.lParam).dbcv_unitmask,
PDevBroadcastVolume(Msg.lParam).dbcv_flags]));
DBT_DEVTYP_NET: AddLog(Format('*%s: %s - 0x%x',[m,d,PDevBroadcastNet(Msg.lParam).dbcn_resource]));
DBT_DEVTYP_DEVICEINTERFACE:
try
AddLog(Format('*%s: %s - %s (Class: %s)',[m,d,
string(PChar(@PDevBroadcastDeviceInterface(Msg.lParam).dbcc_name)),
GUIDToString(PDevBroadcastDeviceInterface(Msg.lParam).dbcc_classguid)]));
except
AddLog(Format('*%s: %s',[m,d]));
end;
DBT_DEVTYP_HANDLE: AddLog(Format('*%s - %s - %s',[m,d,GUIDToString(PDevBroadcastHandle(Msg.lParam).dbch_eventguid)]));
else AddLog(Format('*%s: %s',[m,d]));
end;
end;
else AddLog(Format('*%s: 0x%x',[m,Msg.lParam]));
end;
end;
MiTeC DeviceMonitor Demo
Developers can use this MiTeC Component suite and able to monitor the devices with writing less code.
Expand your Korean vocabulary with Tyler Rasch through 4-character idioms based on Hanja! This is the perfect course for intermediate learners who are looking to build a more robust Korean vocabulary. You will find yourself using these expressions right away in your Korean conversations.
Target level
From mid intermediate to upper advanced
What can you achieve through this course?
Build a foundation in essential Hanja-based words to develop a more robust vocabulary
Mon Feb 01 2021 07:16:01 GMT+0700 (Western Indonesia Time)
Open encryption standards are best for security and privacy most of the time. Pretty Good Privacy (PGP) standard specifies encryption formats to facilitate private messaging capabilities for email and other message encryption.
IPWorks OpenPGP is a complete set of components for email encryption and document protection. IPWorks OpenPGP implements the OpenPGP standard for encryption and decryption and includes support for OpenPGP key creation and management.
IPWorks OpenPGP Features
Enterprise-Grade components
Encrypt, decrypt, sign and verify via OpenPGP
Solid components to utilize
Support for string hashing and encryption algorithms
IPWorks OpenPGP In Action – Delphi
procedure TFormOpenPGP.btnEncryptClick(Sender: TObject);
begin
if (Length(cboRecipientKeys.Text) <= 0) then
begin
ShowMessage('Please select a recipient key.');
Exit;
end;
pgp.InputMessage := txtDecryptedString.Text;
pgp.RecipientKeyCount := 1;
pgp.RecipientKeyKeyring[0] := txtKeyringDir.Text;
pgp.RecipientKeyUserId[0] := cboRecipientKeys.Text;
pgp.ASCIIArmor := true;
pgp.Encrypt();
txtEncryptedString.Text := pgp.OutputMessage;
end;
When you install IPworks OpenPGP it comes with several demo applications which show you how to utilize all the functionalities of the OpenPGP library.
Be sure to head over and check out the IPWorks OpenPGP Library on GetIt portal and download it from the IDE
Mon Feb 01 2021 06:17:00 GMT+0700 (Western Indonesia Time)
Sometimes your application needs a user interface, but what is the best way to make one for Python applications? Enter DelphiVCL for Python. The VCL is a mature Windows native GUI framework with a huge library of included visual components and a robust collection of 3rd party components. It is the premier framework for native Windows applications, but how to use it with Python? Thanks to the DelphiVCL Python package, the VCL is a first-class package for building native Windows GUIs with Python. Need more design tools? You can build the entire GUI in Delphi and then write all the logic in Python. DelphiVCL is the fastest, most mature, and complete GUI library for native Windows Python GUI development.
GitHub、BitBucket、Sourceforge、GitLab、Redmine、Assemblaのいずれかでホストされ、一般公開済で、50人以上のフォロワー、ウォッチ、星、レビュー、週間ダウンロード数などを獲得しているオープンソースアプリケーション。リポジトリまたは関連するWebサイトに、「Powered by Delphi」バッヂとエンバカデロのホームページまたはDelphi製品ページへのリンクがあること。
Mon Feb 01 2021 00:38:04 GMT+0700 (Western Indonesia Time)
Embarcadero commissioned a whitepaper to investigate the differences between Delphi, WPF .NET Framework, and Electron for building Windows desktop applications. The benchmark application – a Windows 10 Calculator clone – was recreated in each framework by three Delphi Most Valuable Professionals (MVPs) volunteers, one expert freelance WPF developer, and one expert Electron freelance developer. In this blog post, we are going to explore the Long-term Feasibility metric which is part of the functionality comparison used in the whitepaper.
Long-term Feasibility
When businesses choose Delphi as their development framework, they are investing in a proprietary framework (that includes runtime library source code) with up-front costs and an optional annual update fee. For this cost, they gain a stable, backward compatible, and growing framework, and can be confident that applications developed today will be supported and maintainable in the future.
Windows Presentation Foundation with .NET Framework offers businesses an economical framework with the full backing of Microsoft but includes all the challenges Microsoft’s choices induce. WPF has a shorter history than Delphi but was open-sourced in 2018, which might give some version of it a bright long-term outlook despite its ties to the proprietary .NET Framework for most Windows development. .NET Framework 4.8 was the last release in April 18, 2019 according to Microsoft.
Electron is a free, open-source platform offering businesses the opportunity to develop applications from any major operating system. Electron’s future is uncertain, however. The Electron project is run by GitHub which is now a subsidiary of Microsoft. It is the newest of the three frameworks and still in its honeymoon phase. It lacks a native IDE, giving businesses a choice but also removing some conveniences like integrated compilation and included testing libraries. Businesses developing in-house tools would have a more difficult time with Electron than the other frameworks.
Let’s take a look at each framework.
Delphi
Delphi has been growing, maturing, and expanding since 1995. It’s development maintains backward compatibility to the degree that a 1995 application can be ported to the current Delphi version with minimal changes. Comprehensive documentation aids maintenance, and a full support team is available for upgrade, migration, or troubleshooting help. At the time of this writing the latest version of Delphi is available in RAD Studio 10.4.1 Sydney which was released September 2nd, 2020. Want to find out more? Check out the release notes from many Delphi versions.
For some context on the programming language timeline C++ came out in 1983, Python came out in 1991, Java came out in 1995, PHP came out in 1995, JavaScript came out in 1995, and Delphi came out in 1995. 1995 was a birth year for a lot of these programming languages as you can see. The Delphi Anniversary website contains a Delphi Release Timeline from 1995 to the present. Here is an excerpt from the timeline of releases over the last 25 years.
DELPHI 1 – FEBRUARY 14TH, 1995
16-bit Windows 3.1 support, Visual Two-Way tools, Components / VCL, Database support via BDE and SQL Links, Database data live at design time
DELPHI 2 (1996)
32-bit Windows 95 support, Database Grid, OLE automation, Visual form inheritance, Long strings, Included Delphi 1 for 16-bit
Docking, Anchors and Constraints, Method Overloading, Dynamic arrays, Windows 98 support
DELPHI 5 (1999)
Desktop layouts, Frames, XML support, DBGo for ADO, Language Translations
DELPHI 6 (2001)
Structure Window, SOAP Web Services, dbExpress, BizSnap, WebSnap, DataSnap
DELPHI 7 (2002)
Web application development, Windows XP themes
DELPHI 8 (2003)
.NET support
DELPHI 2005 (2004)
Multi-unit namespaces, Error Insight, History Tab, for..in, Function inlining, Theme-enabled IDE, Refactorings, Wild-card in uses statement, Data Explorer, Integrated Unit Testing
DELPHI 2006 (2005)
Operator overloading, Static methods and properties, Designer Guidelines, Form positioner view, Live code templates, Block Completion, Line numbers, Change Bars, Sync-edit, Code Folding and method navigation, Debugging Tool-Tips, Searchable Tool Palette, FastMM memory manager, Support for MySQL, Unicode support in dbExpress, TTrayIcon, TFlowPanel, TGridPanel
DELPHI 2007 (2006)
MS Build, Build Events, Build Configurations, Windows Vista support – glassing, theming, dbExpress 4 – connection pooling, delegate drivers, CPU viewer windows, FastCode enhancements, IntraWeb / AJAX support, Welcome Page, Sim-ship of English, French, German, Japanese
DELPHI 2009 (2008)
Unicode, Generics, Anonymous Methods, Ribbon Controls, DataSnap, Build Configurations, Class Explorer, Type Library Editor Window, PNG support
DELPHI 2010 (2009)
Attributes, Enhanced RTTI, Direct2D canvas, Windows 7 support, Touch/Gestures, Source Code Formatter, Thread Specific Breakpoints, Debugger Visualizers, IOUtils unit for files, paths and directories, Source Code Audits and Metrics, Background Compilation, Source code for MIDAS.DLL
DELPHI XE (2010)
Regular Expression Library, Subversion Integration, dbExpress –Filters, Authentication, ProxyGeneration, JavaScript Framework, REST support, Indy WebBroker, Cloud – Amazon EC2, Microsoft Azure, Build Groups, Named Threads in the Debugger, Command line Audits, Metrics and Documentation Generation
DELPHI XE2 (2011)
64-Bit Windows, Mac OSX, FireMonkey, Live Bindings – FireMonkey and VCL, VCL Styles, Unit Scope Names, Platform Assistant, DataSnap – Connectors for Mobile Devices, Cloud API, HTTPS support, TCP monitoring, dbExpress support for ODBC drivers, Deployment Manager
DELPHI XE3 (2012)
Metropolis UI for Windows 8, 7, Vista and XP, FM actions, touch/gestures, layouts and anchors, FM support for bitmap styles, TMaterial source for FM 3D components, FM audio/video, VCL/FM support for sensor devices, FM Location sensor component, Virtual keyboard support, DirectX 10 support
DELPHI XE4 (APRIL 2013)
iOS support – device, simulator, iOS app store, iOS support for standard and retina displays, iOS styles, retina styles, virtual keyboards, Mobile form designer, TWebBrowser component, iOS ARC (automatic reference counting) for all TObject classes, Platform Services, Notifications, Location, Motion and Orientation sensor components, TListView component, Mac OSX full screen support, Deployment manager for iOS devices, FireDAC universal data access components, InterBase – IBLite and IBToGo
DELPHI XE5 (SEPTEMBER 2013)
Android support – devices and emulator. OS versions: Jelly Bean, Ice Cream Sandwich, and Gingerbread, Notification component, iOS 7 style support, Configurable form designer for mobile devices, Deployment manager for Android devices, REST Services client access and authentication components, Android support for all of the XE4 FM and database features listed above
DELPHI XE6 (APRIL 2014)
Windows 7 and 8.1 styles, Acces to Cloud base RESTful WEB Services, FireDAC Compatible with more databases, Fully integrated InterBase support
DELPHI XE7 (SEPTEMBER 2014)
FireMonkey Multi-Device Applications Support Both Desktop and Mobile Platforms, IBLite embeddable database for Windows, Mac, Android and iOS, Multi-Display Support, Multi-Touch Support and Gestures Changes, Full-Screen Immersive Mode for Android, FireMonkey Supports the Pull-to-Refresh Feature for TListView on iOS and Android, FireMonkey Save State Feature
DELPHI XE8 (APRIL 2015)
GetIt Package Manager, FireDAC Improvements, New Embarcadero Community Toolbar, Native Presentation of TListView, TSwitch, TMemo, TCalendar, TMultiView, and TEdit on iOS, Interactive Maps, New Options for Media Library, InputQuery now Supports Masking Input Fields
DELPHI 10 ‘SEATTLE’ (AUGUST 2015)
Android Background Services Support, FireDAC support for the NoSQL MongoDB database, FireMonkey controls zOrder support for Windows, New TBeaconDevice class for turning a device on one of the supported platforms into a “beacon”, StyleViewer for Windows 10 Style in Bitmap Style Designer, High-DPI Awareness and 4K monitors support, Windows 10 styles, Support for Android Services in the IDE, Support for calling WinRT APIs
DELPHI 10.1 ‘BERLIN’ (APRIL 2016)
Android 6.0 Support, Windows Desktop Bridge Support, Address Book for iOS and Android, New ListView Item Designer, New CalendarView control, QuickEdits for VCL, High DPI Support on Windows, Hint Property Changes, EMS Apache Server Support, GetIt based Web installer
DELPHI 10.2 ‘TOKYO’ (MARCH 2017)
64-bit Linux support for Delphi, FireDAC provides Linux support for all Linux-capable DBMS, MariaDB support (v5.5), MySQL support for v5.7, and Firebird support for Direct I/O, QuickEdits for FMX, New VCL Controls for Windows 10, Updated IDE Look & Feel (Dark Theme), RAD Server Deployment License Included
DELPHI 10.3 ‘RIO’ (NOVEMBER 2018)
C++ 17 for Win32, New Delphi Language Features, FireMonkey Android zOrder, Native Controls and API Level 26, Windows 10, VCL, and HighDPI improvements, Extensive IDE UI modernization, RAD Server architecture extension, Quality and Performance improvements
DELPHI 10.3.1 ‘RIO’ (FEBRUARY 2019)
Expanded support for iOS 12 and iPhone X series devices. RAD Server Console UI redesign and migration to the Ext JS framework (available via GetIt). Improved FireDAC support for Firebird 3.0.4 and Firebird embedded. HTTP and SOAP Client Library Enhancements on Windows. Two new IDE productivity tools: Bookmarks and Navigator. 15 new custom VCL Windows and Multi-Device FireMonkey styles.
DELPHI 10.3.2 ‘RIO’ (JULY 2019)
Delphi macOS 64-bit, C++17 for Windows 64-bit, C++ LSP Code Insight Improvements, RAD Server Wizards and Deployment Improvements, Enhanced Firebase Android Support, Delphi Linux Client Application Support
DELPHI 10.3.3 ‘RIO’ (NOVEMBER 2019)
Delphi Android 64-bit support, iOS 13 and macOS Catalina (Delphi) Support, RAD Server Docker Deployment, Enterprise Connectors in Enterprise & Architect Edition
DELPHI 10.4 ‘SYDNEY’ (MAY 2020)
Significantly enhanced high-performance native Windows support, increased productivity with blazing fast code completion, faster code with managed records and enhanced parallel tasks on modern multi-core CPUs, over 1000 quality and performance enhancements, and much much more.
DELPHI 10.4.1 ‘SYDNEY’ (SEPTEMBER 2020)
RAD Studio 10.4.1 has a strong focus on quality improvements to the IDE, Delphi Code Insight (LSP), Parallel Library, SOAP & XML, C++ Toolchain, FireMonkey, VCL, Delphi Compiler, and iOS Deployment.
WPF .NET Framework
Released in 2006, WPF has developed along with the .NET framework. It was open-sourced by Microsoft in 2018 and has provided several roadmaps indicating community engagement and growth in the near future. Significant .NET changes and Microsoft’s shifting design decisions impact the long-term feasibility of WPF. WPF .NET Framework 4.8 was the final version of .NET Framework according to Microsoft and was released on April 18, 2019.
WPF was introduced in .NET Framework 3.0 in 2006. According to an article on the CodeProject website the WPF versions and enhancements are listed in this table:
WPF Version
Release (YYYY-MM)
.NET Version
Visual Studio Version
Major Features
3.0
2006-11
3.0
N/A
Initial Release. WPF development can be done with VS 2005 (released in Nov 2005) too with few additions.
3.5
2007-11
3.5
VS 2008
Changes and improvements in: Application model, data binding, controls, documents, annotations, and 3-D UI elements.
3.5 SP1
2008-08
3.5 SP1
N/A
Native splash screen support, New WebBrowser control, DirectX pixel shader support. Faster startup time and improved performance for Bitmap effects.
4.0
2010-04
4.0
VS 2010
New controls: Calendar, DataGrid, and DatePicker. Multi-Touch and Manipulation
4.5
2012-08
4.5
VS 2012
New Ribbon control New INotifyDataErrorInfo interface
4.5.1
2013-10
4.5.1
VS 2013
No Major Change
4.5.2
2014-05
4.5.2
N/A
No Major Change
4.6
2015-07
4.6
VS 2015
Transparent child window support HDPI and Touch improvements
.NET Framework 4.6.1 – The release of .NET Framework 4.6.1 was announced on 30 November 2015. This version requires Windows 7 SP1 or later. New features and APIs include:
.NET Framework 4.6.2 – The preview of .NET Framework 4.6.2 was announced on March 30, 2016. It was released on August 2, 2016. This version requires Windows 7 SP1 or later.
.NET Framework 4.7 – On 5 April 2017, Microsoft announced that .NET Framework 4.7 was integrated into Windows 10 Creators Update, promising a standalone installer for other Windows versions. An update for Visual Studio 2017 was released on this date to add support for targeting .NET Framework 4.7. The promised standalone installer for Windows 7 and later was released on 2 May 2017, but it had prerequisites not included with the package.
.NET Framework 4.7.1 – .NET Framework 4.7.1 was released on 17 October 2017. Amongst the fixes and new features, it corrects a d3dcompiler dependency issue. It also adds compatibility with the .NET Standard 2.0 out of the box.
.NET Framework 4.7.2 – .NET Framework 4.7.2 was released on 30 April 2018. Amongst the changes are improvements to ASP.NET, BCL, CLR, ClickOnce, Networking, SQL, WCF, Windows Forms, Workflow and WPF. This version is included with Server 2019.
.NET Framework 4.8 – .NET Framework 4.8 was released on 18 April 2019. It was the final version of .NET Framework, all future work going into the .NET Core platform that will eventually become .NET 5 and onwards. This release included JIT enhancements ported from .NET Core 2.1, High DPI enhancements for WPF applications, accessibility improvements, performance updates, and security enhancements. It supported Windows 7, Server 2008 R2, Server 2012, 8.1, Server 2012 R2, 10, Server 2016 and Server 2019 and also shipped as a Windows container image. The most-recent release is 4.8.0 Build 3928, released on July 25, 2019 with an offline installer size of 111 MB and a digital signature date of July 25, 2019.
-Wikipedia
Electron
Released in 2013, Electron is actively developed and maintained by GitHub and has rapidly provided support for emerging technologies like Apple Silicon (circa Nov 2020). It lacks the history and stable longevity needed to determine if Electron apps built in 2020 will survive through 2030. GitHub is a subsidiary of Microsoft. Electron offers a free alternative to Delphi and WPF, familiarity to front-end developers, and cross-platform capability at the cost of IP protection, standard IDE tooling, and application performance.
According to the Electron Release timeline ( https://www.electronjs.org/docs/tutorial/electron-timelines ) here are the releases.
Version
-beta.1
Stable
Chrome
Node
2.0.0
2018-02-21
2018-05-01
M61
v8.9
3.0.0
2018-06-21
2018-09-18
M66
v10.2
4.0.0
2018-10-11
2018-12-20
M69
v10.11
5.0.0
2019-01-22
2019-04-24
M73
v12.0
6.0.0
2019-05-01
2019-07-30
M76
v12.4
7.0.0
2019-08-01
2019-10-22
M78
v12.8
8.0.0
2019-10-24
2020-02-04
M80
v12.13
9.0.0
2020-02-06
2020-05-19
M83
v12.14
10.0.0
2020-05-21
2020-08-25
M85
v12.16
11.0.0
2020-08-27
2020-11-17
M87
v12.18
12.0.0
2020-11-19
2021-03-02
M89
v14.x
Delphi provides the most assured long-term outlook, best intellectual property security, and easiest in-house customization at the cost of a one-time commercial license purchase. WPF’s barrier to entry is lower and it offers better accessibility options but is subject to Microsoft’s .NET overhauls, is more difficult to customize, and can be decompiled with ease. Electron is absolutely free and can be developed on each of the three major desktop platforms but pays for that flexibility via its uncertain long-term outlook and by relying on corporate sponsorships and community support for additional development.
Ready to explore all of the metrics in the Windows desktop framework comparison research whitepaper?
Sun Jan 31 2021 19:50:02 GMT+0700 (Western Indonesia Time)
The CachedUpdates sample shows you how to work with the TFDMemTable class. To this end, TFDMemTable retrieves data from a database through TFDTableAdapter and TFDCommand. Then, the sample uses some methods and properties of TFDTableAdapter in order to implement some features related with the management of Cached Updates.
Location
You can find the CachedUpdates sample project at:
Start | Programs | Embarcadero RAD Studio Sydney | Samples and then navigate to:
You can find Delphi code samples in GitHub Repositories. Search by name into the samples repositories according to your RAD Studio version.
How to Use the Sample
Navigate to the location given above and open CDS_CachedUpdates.dproj.
Press F9 or choose Run > Run.
Click on the Use Connection Definition combo box and select an option.
Modify the tables and interact with the provided buttons.
Files
File in Delphi
Contains
CDS_CachedUpdates.dproj CDS_CachedUpdates.dpr
The project itself.
fCachedUpdates.pas fCachedUpdates.fmx
The main form.
Implementation
This sample uses three main components:
TFDCommand. It uses TFDConnection to connect to the desired database. In the commandText property of TFDCommand there is a SQL command for selecting data from DB: select * from {id Orders}. You can check it on the Object Inspector.
When you run the application, click on the Use Connection Definition combo box and select an option in order to define a connection. When you select an item of the combo box, the Active property is set to True in order to open a dataset and read data from a database. Then, the sample displays a table using a TDBGrid component. Once the TDBGrid is filled, you can interact with the sample. Each of the following buttons implements an OnClick event to do what is described below:
The RevertRecord button uses the RevertRecord method to undo changes to the current record and remove it from the dataset changes log.
The UndoLastChange button uses the UndoLastChange method to undo the last modification to the dataset records and remove the change from the dataset change log.
The CancelUpdates button uses the CancelUpdates method to remove all records from the change log and restore the dataset rows to their prior editing state.
The ApplyUpdates button uses the ApplyUpdates method to apply changes for all records in the dataset change journal to the database.
Note: These methods may be used only when the CachedUpdates property is set to True. To check it, select the DataSource1 object attached to the TFDMemTable named cdsOrders and see the CachedUpdates property of the DataSet property on the Object Inspector.
To get more details on this sample, please visit the link below:
Sun Jan 31 2021 18:00:42 GMT+0700 (Western Indonesia Time)
Last Updated on February 1, 2021
There is a lot of confusion for beginners around what algorithm is used to train deep learning neural network models.
It is common to hear neural networks learn using the “back-propagation of error” algorithm or “stochastic gradient descent.” Sometimes, either of these algorithms is used as a shorthand for how a neural net is fit on a training dataset, although in many cases, there is a deep confusion as to what these algorithms are, how they are related, and how they might work together.
This tutorial is designed to make the role of the stochastic gradient descent and back-propagation algorithms clear in training between networks.
In this tutorial, you will discover the difference between stochastic gradient descent and the back-propagation algorithm.
After completing this tutorial, you will know:
Stochastic gradient descent is an optimization algorithm for minimizing the loss of a predictive model with regard to a training dataset.
Back-propagation is an automatic differentiation algorithm for calculating gradients for the weights in a neural network graph structure.
Stochastic gradient descent and the back-propagation of error algorithms together are used to train neural network models.
Let’s get started.
Difference Between Backpropagation and Stochastic Gradient Descent Photo by Christian Collins, some rights reserved.
Tutorial Overview
This tutorial is divided into three parts; they are:
Stochastic Gradient Descent
Backpropagation Algorithm
Stochastic Gradient Descent With Back-propagation
Stochastic Gradient Descent
Gradient Descent is an optimization algorithm that finds the set of input variables for a target function that results in a minimum value of the target function, called the minimum of the function.
As its name suggests, gradient descent involves calculating the gradient of the target function.
You may recall from calculus that the first-order derivative of a function calculates the slope or curvature of a function at a given point. Read left to right, a positive derivative suggests the target function is sloping uphill and a negative derivative suggests the target function is sloping downhill.
Derivative: Slope or curvature of a target function with respect to specific input values to the function.
If the target function takes multiple input variables, they can be taken together as a vector of variables. Working with vectors and matrices is referred to linear algebra and doing calculus with structures from linear algebra is called matrix calculus or vector calculus. In vector calculus, the vector of first-order derivatives (partial derivatives) is generally referred to as the gradient of the target function.
Gradient: Vector of partial derivatives of a target function with respect to input variables.
The gradient descent algorithm requires the calculation of the gradient of the target function with respect to the specific values of the input values. The gradient points uphill, therefore the negative of the gradient of each input variable is followed downhill to result in new values for each variable that results in a lower evaluation of the target function.
A step size is used to scale the gradient and control how much to change each input variable with respect to the gradient.
Step Size: Learning rate or alpha, a hyperparameter used to control how much to change each input variable with respect to the gradient.
This process is repeated until the minimum of the target function is located, a maximum number of candidate solutions are evaluated, or some other stop condition.
Gradient descent can be adapted to minimize the loss function of a predictive model on a training dataset, such as a classification or regression model. This adaptation is called stochastic gradient descent.
Stochastic Gradient Descent: Extension of the gradient descent optimization algorithm for minimizing a loss function of a predictive model on a training dataset.
The target function is taken as the loss or error function on the dataset, such as mean squared error for regression or cross-entropy for classification. The parameters of the model are taken as the input variables for the target function.
Loss function: target function that is being minimized.
Model parameters: input parameters to the loss function that are being optimized.
The algorithm is referred to as “stochastic” because the gradients of the target function with respect to the input variables are noisy (e.g. a probabilistic approximation). This means that the evaluation of the gradient may have statistical noise that may obscure the true underlying gradient signal, caused because of the sparseness and noise in the training dataset.
The insight of stochastic gradient descent is that the gradient is an expectation. The expectation may be approximately estimated using a small set of samples.
Stochastic gradient descent can be used to train (optimize) many different model types, like linear regression and logistic regression, although often more efficient optimization algorithms have been discovered and should probably be used instead.
Stochastic gradient descent (SGD) and its variants are probably the most used optimization algorithms for machine learning in general and for deep learning in particular.
Stochastic gradient descent is the most efficient algorithm discovered for training artificial neural networks, where the weights are the model parameters and the target loss function is the prediction error averaged over one, a subset (batch) of the entire training dataset.
Nearly all of deep learning is powered by one very important algorithm: stochastic gradient descent or SGD.
There are many popular extensions to stochastic gradient descent designed to improve the optimization process (same or better loss in fewer iterations), such as Momentum, Root Mean Squared Propagation (RMSProp) and Adaptive Movement Estimation (Adam).
A challenge when using stochastic gradient descent to train a neural network is how to calculate the gradient for nodes in hidden layers in the network, e.g. nodes one or more steps away from the output layer of the model.
This requires a specific technique from calculus called the chain rule and an efficient algorithm that implements the chain rule that can be used to calculate gradients for any parameter in the network. This algorithm is called back-propagation.
Back-Propagation Algorithm
Back-propagation, also called “backpropagation,” or simply “backprop,” is an algorithm for calculating the gradient of a loss function with respect to variables of a model.
Back-Propagation: Algorithm for calculating the gradient of a loss function with respect to variables of a model.
You may recall from calculus that the first-order derivative of a function for a specific value of an input variable is the rate of change or curvature of the function for that input. When we have multiple input variables for a function, they form a vector and the vector of first-order derivatives (partial derivatives) is called the gradient (i.e. vector calculus).
Gradient: Vector of partial derivatives of specific input values with respect to a target function.
Back-propagation is used when training neural network models to calculate the gradient for each weight in the network model. The gradient is then used by an optimization algorithm to update the model weights.
The algorithm was developed explicitly for calculating the gradients of variables in graph structures working backward from the output of the graph toward the input of the graph, propagating the error in the predicted output that is used to calculate gradient for each variable.
The back-propagation algorithm, often simply called backprop, allows the information from the cost to then flow backwards through the network, in order to compute the gradient.
The loss function represents the error of the model or error function, the weights are the variables for the function, and the gradients of the error function with regard to the weights are therefore referred to as error gradients.
Error Function: Loss function that is minimized when training a neural network.
Weights: Parameters of the network taken as input values to the loss function.
Error Gradients: First-order derivatives of the loss function with regard to the parameters.
This gives the algorithm its name “back-propagation,” or sometimes “error back-propagation” or the “back-propagation of error.”
Back-Propagation of Error: Comment on how gradients are calculated recursively backward through the network graph starting at the output layer.
The algorithm involves the recursive application of the chain rule from calculus (different from the chain rule from probability) that is used to calculate the derivative of a sub-function given the derivative of the parent function for which the derivative is known.
The chain rule of calculus […] is used to compute the derivatives of functions formed by composing other functions whose derivatives are known. Back-propagation is an algorithm that computes the chain rule, with a specific order of operations that is highly efficient.
Chain Rule: Calculus formula for calculating the derivatives of functions using related functions whose derivatives are known.
There are other algorithms for calculating the chain rule, but the back-propagation algorithm is an efficient algorithm for the specific graph structured using a neural network.
It is fair to call the back-propagation algorithm a type of automatic differentiation algorithm and it belongs to a class of differentiation techniques called reverse accumulation.
The back-propagation algorithm described here is only one approach to automatic differentiation. It is a special case of a broader class of techniques called reverse mode accumulation.
Although Back-propagation was developed to train neural network models, both the back-propagation algorithm specifically and the chain-rule formula that it implements efficiently can be used more generally to calculate derivatives of functions.
Furthermore, back-propagation is often misunderstood as being specific to multi-layer neural networks, but in principle it can compute derivatives of any function …
Stochastic Gradient Descent is an optimization algorithm that can be used to train neural network models.
The Stochastic Gradient Descent algorithm requires gradients to be calculated for each variable in the model so that new values for the variables can be calculated.
Back-propagation is an automatic differentiation algorithm that can be used to calculate the gradients for the parameters in neural networks.
Together, the back-propagation algorithm and Stochastic Gradient Descent algorithm can be used to train a neural network. We might call this “Stochastic Gradient Descent with Back-propagation.”
Stochastic Gradient Descent With Back-propagation: A more complete description of the general algorithm used to train a neural network, referencing the optimization algorithm and gradient calculation algorithm.
It is common for practitioners to say they train their model using back-propagation. Technically, this is incorrect. Even as a short-hand, this would be incorrect. Back-propagation is not an optimization algorithm and cannot be used to train a model.
The term back-propagation is often misunderstood as meaning the whole learning algorithm for multi-layer neural networks. Actually, back-propagation refers only to the method for computing the gradient, while another algorithm, such as stochastic gradient descent, is used to perform learning using this gradient.
It would be fair to say that a neural network is trained or learns using Stochastic Gradient Descent as a shorthand, as it is assumed that the back-propagation algorithm is used to calculate gradients as part of the optimization procedure.
That being said, a different algorithm can be used to optimize the parameter of a neural network, such as a genetic algorithm that does not require gradients. If the Stochastic Gradient Descent optimization algorithm is used, a different algorithm can be used to calculate the gradients for the loss function with respect to the model parameters, such as alternate algorithms that implement the chain rule.
Nevertheless, the “Stochastic Gradient Descent with Back-propagation” combination is widely used because it is the most efficient and effective general approach sofar developed for fitting neural network models.
Further Reading
This section provides more resources on the topic if you are looking to go deeper.
Sun Jan 31 2021 00:07:13 GMT+0700 (Western Indonesia Time)
Robo-Analyst — это мощное финансовое программное обеспечение, которое дает мгновенный анализ более чем 16 000 акций, фондов и криптовалют, созданное на Delphi. Согласно Robo-Analyst, их передовое программное обеспечение анализирует и интерпретирует наиболее широко используемые индикаторы; с ежедневным, краткосрочным и долгосрочным прогнозом. Программное обеспечение объясняет анализ просто на графике и в тексте, чтобы помочь инвесторам принять быстрое и обоснованное решение. Анализ на конец дня и внутри дня доступен для криптовалют, таких как BitCoin и Etherium, а также для акций, таких как Amazon, Google, Facebook, GameStop, BlackBerry, AMC и многих других. Все автоматически анализируется на одном экране; Состояние рынка, время рынка и технический анализ любых акций и многих криптовалют. Робо-аналитик говорит, что это может принести пользу как новичкам, так и экспертам. Создатель Robo-Analyst провел годы в исследованиях и разработках, совершенствуя программные алгоритмы Robo-Analyst. Первоначально он был построен на Delphi 7, но недавно был обновлен до последней версии Delphi. Он использует технологии Delphi, такие как WebBroker, RAD Server и FireDAC, в сочетании с другими языками и технологиями, такими как React, PHP и AngularJS. Это отличный пример Delphi, лежащего в основе бизнеса, с поддерживающими его другими интерфейсными и серверными технологиями.
Sun Jan 31 2021 00:06:46 GMT+0700 (Western Indonesia Time)
O Robo-Analyst é um software financeiro poderoso que fornece uma análise instantânea de mais de 16.000 ações, fundos e criptomoedas e é desenvolvido com Delphi. De acordo com a Robo-Analyst, seu software avançado analisa e interpreta os indicadores mais usados; com uma perspectiva Diária, de Curto e Longo Prazo. O software explica a análise simplesmente no gráfico e em texto para ajudar os investidores a tomar uma decisão rápida e informada. A análise de fim do dia e intradiária está disponível para criptomoedas como BitCoin e Etherium, além de ações como Amazon, Google, Facebook, GameStop, BlackBerry, AMC e muitos mais. Tudo é analisado automaticamente em uma tela; Condição do mercado, timing do mercado e análise técnica em qualquer ação e muitas criptomoedas. Robo-Analyst diz que pode beneficiar iniciantes e especialistas. O criador do Robo-Analyst passou anos em P&D aperfeiçoando os algoritmos do software Robo-Analyst. Originalmente, ele foi construído em Delphi 7, mas foi recentemente atualizado para a versão mais recente do Delphi. Ele usa tecnologias Delphi como WebBroker, RAD Server e FireDAC combinadas com outras linguagens e tecnologias como React, PHP e AngularJS. Este é um ótimo exemplo de Delphi no centro de um negócio com outras tecnologias de front-end e back-end suportando-o.
Sun Jan 31 2021 00:06:11 GMT+0700 (Western Indonesia Time)
Robo-Analyst es un poderoso software financiero que brinda un análisis instantáneo de más de 16,000 acciones, fondos y criptomonedas y está construido con Delphi. Según Robo-Analyst, su software avanzado analiza e interpreta los indicadores más utilizados; con una perspectiva diaria, a corto y largo plazo. El software explica el análisis simplemente en el gráfico y en texto para ayudar a los inversores a tomar una decisión rápida e informada. El análisis de final del día e intradía está disponible para criptomonedas como BitCoin y Etherium, además de acciones como Amazon, Google, Facebook, GameStop, BlackBerry, AMC y muchas más. Todo se analiza automáticamente en una pantalla; Condición del mercado, sincronización del mercado y análisis técnico de cualquier acción y muchas criptomonedas. Robo-Analyst dice que puede beneficiar tanto a principiantes como a expertos. El creador de Robo-Analyst pasó años en I + D perfeccionando los algoritmos de software de Robo-Analyst. Originalmente se construyó en Delphi 7, pero recientemente se actualizó a la última versión de Delphi. Utiliza tecnologías Delphi como WebBroker, RAD Server y FireDAC combinadas con otros lenguajes y tecnologías como React, PHP y AngularJS. Este es un gran ejemplo de Delphi en el núcleo de un negocio con otras tecnologías de front-end y back-end que lo respaldan.
Sun Jan 31 2021 00:05:46 GMT+0700 (Western Indonesia Time)
Robo-Analyst ist eine leistungsstarke Finanzsoftware, die eine sofortige Analyse von mehr als 16.000 Aktien, Fonds und Kryptowährungen bietet und mit Delphi aufgebaut ist. Nach Robo-Analyst ihre fortschrittliche Software analysiert und interpretiert die am häufigsten verwendeten Indikatoren; mit einem täglichen, kurzfristigen und langfristigen Ausblick. Die Software erklärt die Analyse einfach auf dem Chart und im Text, um Investoren zu helfen, eine schnelle, informierte Entscheidung zu treffen. Tagesend- und Intraday-Analysen sind für Kryptowährungen wie BitCoin und Etherium sowie Aktien wie Amazon, Google, Facebook, GameStop, BlackBerry, AMC und viele mehr verfügbar. Alles wird automatisch auf einem Bildschirm analysiert; Marktzustand, Market Timing und technische Analyse für jede Aktie und viele Kryptowährungen. Robo-Analyst sagt, dass es sowohl für Anfänger als auch für Experten von Nutzen sein kann. Der Schöpfer von Robo-Analyst verbrachte Jahre in Forschung und Entwicklung, um die Algorithmen der Robo-Analyst Software zu perfektionieren. Ursprünglich wurde es in Delphi 7 entwickelt, wurde aber kürzlich auf die neueste Version von Delphi aktualisiert. Es nutzt Delphi-Technologien wie WebBroker, RAD Server und FireDAC in Kombination mit anderen Sprachen und Technologien wie React, PHP und AngularJS. Dies ist ein großartiges Beispiel für Delphi als Kernstück eines Unternehmens, das von anderen Frontend- und Backend-Technologien unterstützt wird.
Sat Jan 30 2021 17:34:01 GMT+0700 (Western Indonesia Time)
Running the FMX.TabletMasterDetailwithSearch Sample, it shows you two columns. The column on the left-hand side shows a list of people and includes a search box. The column on the right-hand side shows details (a picture, name, job and “description”) about the person currently selected on the list view.
You can tap list view entries to select them and load their information on the right-hand side column. You can also click the Prior and Next button on the top-right corner of the application to navigate the list view items.
You can also enter text in the search box of the list view to filter the list of people.
Location
You can find the TabletMasterDetailwithSearch Sample sample project at:
Start | Programs | Embarcadero RAD Studio Sydney | Samples and navigate to:
This application handles the OnItemClick event of the list view with a procedure that takes the TPrototypeBindSource to the clicked entry, so that the right-hand side column of the application shows that information.
This application contains a TActionList with two actions that are associated with the Prior and Next buttons. These actions are the standard TFMXBindNavigatePrior and TFMXBindNavigateNext actions and they are linked with the TPrototypeBindSource through their DataSource property and have event handlers for their OnExecute and OnUpdate events. The Execute event handler takes the TPrototypeBindSource to the next entry and the Update event handler disables when there is no prior or following item, respectively.
The SearchVisible property of the list view is True, so that the list view shows a search box to filter the list view items. The Update event handler of the Prior and Next actions disables these actions when the list view is filtered.
Please follow the link to the original post for more details about this sample:
Sat Jan 30 2021 11:24:08 GMT+0700 (Western Indonesia Time)
In my previous article Tweaking DFM Loading I explained ways to overcome the name problem with several instances of a data module. Actually there is still another way to resolve this.
In case you didn’t already, you should read that article first to understand what I am talking about here.
The FOnFindComponentInstance checks Screen.DataModules for a data module with the name in question. If we can avoid adding our data module to that list, the name of the newly created TMainDM instance will remain unchanged.
To skip adding a TDataModule instance to the Screen.DataModules list, we need to override its CreateNew method and change the Dummy parameter to -1.
As a consequence our global instance of TMainDM will not be found for TMainForm either. Thus we need to create a local instance of TMainDM in TMainForm, too.
constructor TMainForm.Create(AOwner: TComponent);
begin
TMainDM.Create(Self);
inherited;
end;
Now we don’t need that global instance anymore and remove TMainDM from the auto-created list in the project.
Sat Jan 30 2021 09:23:09 GMT+0700 (Western Indonesia Time)
Another great Delphi birthday approaches! Let’s celebrate with a Showcase Challenge! A few months ago we launched a new Showcases on our blog. This is the place our fantastic developers show off the amazing programs they create with Delphi or C++Builder. We are close to 50 submissions and know there are hundreds more out there. This is where the Showcase Challenge comes in…
Showcase Challenge
Until February 14th, 2021, any Showcase application submission for a Delphi powered application gets a $100 USD gift card*.
There will be three Grand Prize winners Showcases entries that get the most Twitter likes. First place is $3,000 USD in cash* plus a full RAD Studio Architect license, and an InterBase Server license for a total value of over $10,000 USD. The runners-up will each get $500 USD in cash and a RAD Studio Professional License for a total value of over $3,000 USD.
The Showcase is a great way to spread the Delphi message and highlight the amazing things that Delphi developers get done every day! We know you are getting more done with Delphi than teams many times your size.
if you already have a project in the showcase you can just post a link on Twitter tagging @EmbarcaderoTech with #Delphi26th and jump to step 3
Provide the details for your Showcase entry, including a YouTube video, website link, Twitter handle, description, screenshots, and a shot of your app under development in the IDE!
Showcase entry must include 6 images (1080p or better resolution) including screenshots, logos, the app in the IDE, etc., and ideally a video showing the application in action (optional). All images and videos must be on a modern (released in the last 5 years) operating system. If the application doesn’t have any user interface, then a screenshot of the application in the IDE and images showing what it does is also acceptable.
The application must be written in a version of Delphi from 10 Seattle or newer.
The application must be of one of the following types:
An open-source application hosted on GitHub, BitBucket, Sourceforge, GitLab, Redmine, or Assembla with public visibility and a total of at least 10 followers, watches, stars, reviews, weekly downloads, etc. The repository or associated website must have a Powered by Delphi badge and a link to the Delphi product page.
Available for the general public (retail, shareware, freeware, or similar) with a public website and reviews on at least two other software sites.
An internal “line of business application” used by a company with permission to use the company name in the showcase. A representative from the company must be available to verify that the application is written in Delphi.
The $100 USD showcase gift card is limited to 200 submissions. If more than 200 are submitted then the 200 winners will be selected by Embarcadero.
The $100 Gift Card is for $100 USD or approximate equivalent value in local currencies. The gift card is available from your choice of Google Play, Apple, or Amazon gift card (each international Amazon has a limited shipping area, and not all offer Amazon gift cards).
The contest is open to anyone with a valid license for Delphi or RAD Studio from the 10 Seattle release or newer (including Community and Academic Editions!)
The final decision of winning eligibility is at Embarcadero’s sole discretion. Void where prohibited, restricted, or limited.
Sat Jan 30 2021 00:09:17 GMT+0700 (Western Indonesia Time)
Приближается еще один отличный день рождения Delphi! Давайте отпразднуем с помощью Showcase Challenge ! Несколько месяцев назад мы запустили новый раздел блога под названием Showcases . Здесь наши фантастические разработчики демонстрируют великолепные программы, созданные с помощью Delphi (или C ++ Builder). У нас почти 50 заявок, и мы знаем, что их еще сотни. Вот здесь-то и появляется задача Showcase …
Showcase Challenge
До 14 февраля 2021 года любая заявка Showcase для приложения на базе Delphi получит подарочную карту на 100 долларов США * .
Будет три записи победителей конкурса Showcases, которые наберут наибольшее количество лайков в Twitter. Первое место $ 3000 USD наличными ** плюс полный лицензии Architect RAD Studio , и InterBase сервера лицензий на общую сумму более $ 10 000 + USD. Каждый, занявший второе место, получит 500 долларов США наличными ** и лицензию RAD Studio Professional на общую сумму более 3000 долларов США .
Витрина является отличным способом , чтобы распространить сообщение Delphi и выделить удивительные вещи , которые разработчики Delphi сделаны каждый день! Мы знаем, что вы делаете больше с Delphi, чем команды, во много раз превышающие ваш размер.
если у вас уже есть проект в витрине, вы можете просто опубликовать ссылку в Twitter, пометив @EmbarcaderoTech с # Delphi26th, и перейти к шагу 3
Предоставьте подробную информацию для своей записи в витрине, включая видео YouTube, ссылку на веб-сайт, дескриптор Twitter, описание, снимки экрана и снимок вашего приложения, разрабатываемого в среде IDE!
Запись в витрине должна включать 6 изображений (разрешение 1080p или выше), включая снимки экрана, логотипы, приложение в среде IDE и т. Д. И, при необходимости, видео, показывающее приложение в действии. Все изображения и видео должны быть в современной (выпущенной за последние 5 лет) операционной системе. Если приложение не имеет пользовательского интерфейса, то можно также сделать снимок экрана приложения в среде IDE и изображения, показывающие, что оно делает.
Приложение должно быть написано в версии Delphi от 10 Seattle или новее.
Заявление должно быть одного из следующих типов
Приложение с открытым исходным кодом, размещенное на GitHub, BitBucket, Sourceforge, GitLab, Redmine или Assembla с общедоступной видимостью и не менее 50 подписчиков, часов, звезд, обзоров, еженедельных загрузок и т. Д. Репозиторий или связанный веб-сайт должен иметь Powered by Delphi значок и ссылку на домашнюю страницу Embarcadero или страницу продукта Delphi.
Доступно для широкой публики с общедоступным веб-сайтом и обзорами как минимум на двух других авторитетных сайтах программного обеспечения.
Внутреннее «бизнес-приложение», используемое компанией с разрешением на использование названия компании в витрине. Представитель компании должен быть доступен для проверки того, что приложение написано на Delphi.
Подарочная карта витрины на 100 долларов США ограничена до 200 заявок. Если подано более 200 заявок, то 200 победителей будут выбраны Embarcadero.
Подарочная карта на 100 долларов предназначена для оплаты 100 долларов США или ее приблизительной эквивалентной стоимости в местной валюте. Подарочная карта доступна по вашему выбору: подарочная карта Google Play, Apple или Amazon (каждый международный Amazon имеет ограниченную зону доставки, и не все предлагают подарочные карты Amazon).
Конкурс открыт для всех, у кого есть действующая лицензия на Delphi или RAD Studio версии 10 Seattle или новее.
Окончательное решение о праве на победу остается на усмотрение Embarcadero. Недействительно, если это запрещено, ограничено или ограничено.
Sat Jan 30 2021 00:08:58 GMT+0700 (Western Indonesia Time)
Mais um grande aniversário da Delphi se aproxima! Vamos comemorar com um Desafio Showcase ! Há alguns meses, lançamos uma nova seção de blog chamada Showcases . Este é o lugar onde nossos fantásticos desenvolvedores mostram os programas incríveis que eles criam com Delphi (ou C ++ Builder). Estamos perto de 50 inscrições e sabemos que existem centenas mais por aí. É aqui que entra o Showcase Challenge …
Desafio de demonstração
Até 14 de fevereiro de 2021 , qualquer envio de aplicativo Showcase para um aplicativo com tecnologia Delphi receberá um vale-presente de $ 100 USD * .
Haverá três inscrições de Showcases vencedores do Grande Prêmio que obtiverem mais curtidas no Twitter. O primeiro lugar é $ 3.000 USD em dinheiro ** mais uma licença RAD Studio Architect completa , e uma licença InterBase Server por um valor total de mais de $ 10.000 + USD. Cada um dos segundos classificados receberá $ 500 USD em dinheiro ** e uma RAD Studio Professional License por um valor total de mais de $ 3.000 USD .
O Showcase é uma ótima forma de divulgar a mensagem Delphi e destacar as coisas incríveis que os desenvolvedores Delphi fazem todos os dias! Sabemos que você está fazendo mais com a Delphi do que com equipes muitas vezes maiores do que você.
se você já tem um projeto no mostruário, basta postar um link no Twitter marcando @EmbarcaderoTech com # Delphi26th e pular para a etapa 3
Forneça os detalhes de sua entrada no Showcase, incluindo um vídeo do YouTube, link do site, identificador do Twitter, descrição, capturas de tela e uma imagem do seu aplicativo em desenvolvimento no IDE!
A entrada do Showcase deve incluir 6 imagens (1080p ou melhor resolução) incluindo capturas de tela, logotipos, o aplicativo no IDE, etc. e, opcionalmente, um vídeo mostrando o aplicativo em ação. Todas as imagens e vídeos devem estar em um sistema operacional moderno (lançado nos últimos 5 anos). Se o aplicativo não tiver nenhuma interface de usuário, uma captura de tela do aplicativo no IDE e imagens mostrando o que ele faz também é aceitável.
O aplicativo deve ser escrito em uma versão do Delphi de 10 Seattle ou mais recente.
O aplicativo deve ser de um dos seguintes tipos
Um aplicativo de código aberto hospedado no GitHub, BitBucket, Sourceforge, GitLab, Redmine ou Assembla com visibilidade pública e pelo menos 50 seguidores, relógios, estrelas, avaliações, downloads semanais, etc. O repositório ou site associado deve ter um Powered by Delphi crachá e um link para a página inicial da Embarcadero ou a página de produtos Delphi.
Disponível para o público em geral com um site público e avaliações em pelo menos dois outros sites de software de boa reputação.
Um “aplicativo de linha de negócios” interno usado por uma empresa com permissão para usar o nome da empresa na vitrine. Um representante da empresa deve estar disponível para verificar se o aplicativo está escrito em Delphi.
O vale-presente de demonstração de US $ 100 é limitado a 200 envios. Se mais de 200 forem inscritos, os 200 vencedores serão selecionados pela Embarcadero.
O vale-presente de US $ 100 custa US $ 100 ou o valor equivalente aproximado nas moedas locais. O cartão-presente está disponível em sua escolha de cartão-presente do Google Play, Apple ou Amazon (cada Amazon internacional tem uma área de remessa limitada e nem todos oferecem cartões-presente da Amazon).
O concurso está aberto a qualquer pessoa com uma licença válida para Delphi ou RAD Studio da versão 10 Seattle ou mais recente.
A decisão final de elegibilidade para ganhar fica a critério exclusivo da Embarcadero. Nulo onde for proibido, restrito ou limitado.
Sat Jan 30 2021 00:08:07 GMT+0700 (Western Indonesia Time)
¡Se acerca otro gran cumpleaños de Delphi! ¡Celebremos con un Showcase Challenge ! Hace unos meses lanzamos una nueva sección de blog llamada Showcases . Este es el lugar donde nuestros fantásticos desarrolladores muestran los increíbles programas que crean con Delphi (o C ++ Builder). Estamos cerca de 50 presentaciones y sabemos que hay cientos más por ahí. Aquí es donde entra el Showcase Challenge …
Desafío de escaparate
Hasta el 14 de febrero de 2021 , cualquier envío de solicitud Showcase para una aplicación con tecnología Delphi recibe una tarjeta de regalo de $ 100 USD * .
Habrá tres entradas de Showcases ganadores del Gran Premio que obtengan la mayor cantidad de Me gusta en Twitter. El primer lugar es de $ 3,000 USD en efectivo ** más una licencia completa de RAD Studio Architect y una licencia de InterBase Server por un valor total de más de $ 10,000 + USD. Los finalistas recibirán cada uno $ 500 USD en efectivo ** y una licencia profesional de RAD Studio por un valor total de más de $ 3,000 USD .
¡The Showcase es una excelente manera de difundir el mensaje de Delphi y destacar las cosas increíbles que los desarrolladores de Delphi hacen todos los días! Sabemos que está haciendo más con Delphi que con equipos muchas veces su tamaño.
Si ya tiene un proyecto en el escaparate, simplemente puede publicar un enlace en Twitter etiquetando @EmbarcaderoTech con # Delphi26th y saltar al paso 3
Proporcione los detalles de su entrada de Showcase, incluido un video de YouTube, un enlace al sitio web, un identificador de Twitter, una descripción, capturas de pantalla y una toma de su aplicación en desarrollo en el IDE.
¡ Dale me gusta y retuitea tu envío en Twitter, sigue el hashtag # Delphi26th y anima a tus amigos y seguidores a que le den me gusta y retuiteen también!
¡Dale me gusta y retuitea cualquier entrada que te inspire !
¡El 17 de febrero de 2021 , Embarcadero anunciará los ganadores del Gran Premio con más Me gusta!
Requisitos para la presentación de presentaciones:
La entrada al escaparate debe incluir 6 imágenes (1080p o mejor resolución) incluyendo capturas de pantalla, logotipos, la aplicación en el IDE, etc. y, opcionalmente, un video que muestre la aplicación en acción. Todas las imágenes y videos deben estar en un sistema operativo moderno (lanzado en los últimos 5 años). Si la aplicación no tiene ninguna interfaz de usuario, también es aceptable una captura de pantalla de la aplicación en el IDE y las imágenes que muestren lo que hace.
La solicitud debe estar escrita en una versión de Delphi de 10 Seattle o más reciente.
La aplicación debe ser de uno de los siguientes tipos
Una aplicación de código abierto alojada en GitHub, BitBucket, Sourceforge, GitLab, Redmine o Assembla con visibilidad pública y al menos 50 seguidores, relojes, estrellas, reseñas, descargas semanales, etc. El repositorio o sitio web asociado debe tener un Powered by Delphi insignia y un enlace a la página de inicio de Embarcadero, o la página del producto Delphi.
Disponible para el público en general con un sitio web público y reseñas en al menos otros dos sitios de software de renombre.
Una “aplicación de línea de negocio” interna utilizada por una empresa con permiso para utilizar el nombre de la empresa en la presentación. Un representante de la empresa debe estar disponible para verificar que la solicitud esté escrita en Delphi.
La tarjeta de regalo de exhibición de $ 100 USD está limitada a 200 presentaciones. Si se envían más de 200, Embarcadero seleccionará a los 200 ganadores.
La tarjeta de regalo de $ 100 es por $ 100 USD o un valor equivalente aproximado en monedas locales. La tarjeta de regalo está disponible en la tarjeta de regalo de Google Play, Apple o Amazon que elijas (cada Amazon internacional tiene un área de envío limitada y no todas ofrecen tarjetas de regalo de Amazon).
El concurso está abierto a cualquier persona con una licencia válida para Delphi o RAD Studio de la versión 10 de Seattle o más reciente.
La decisión final de ganar la elegibilidad queda a discreción exclusiva de Embarcadero. No válido donde esté prohibido, restringido o limitado.
Sat Jan 30 2021 00:07:41 GMT+0700 (Western Indonesia Time)
Ein weiterer großartiger Delphi-Geburtstag rückt näher! Feiern wir mit einer Showcase Challenge ! Vor einigen Monaten haben wir einen neuen Blog-Bereich namens Showcases gestartet . Hier zeigen unsere fantastischen Entwickler die erstaunlichen Programme, die sie mit Delphi (oder C ++ Builder) erstellen. Wir haben fast 50 Einreichungen und wissen, dass es noch Hunderte mehr gibt. Hier kommt die Showcase Challenge ins Spiel…
Showcase Challenge
Bis zum 14. Februar 2021 erhält jede Einreichung eines Showcase-Antrags für einen Delphi-Antrag eine Geschenkkarte * in Höhe von 100 USD .
Es wird drei Hauptpreisträger geben, die die meisten Twitter-Likes erhalten. Der erste Platz ist $ 3.000 USD in bar ** plus eine vollständige RAD Studio Architect-Lizenz und eine InterBase Server- Lizenz für einen Gesamtwert von über $ 10.000 + USD. Der Zweitplatzierte erhält jeweils 500 USD in bar ** und eine RAD Studio Professional-Lizenz für einen Gesamtwert von über 3.000 USD .
Das Showcase ist eine großartige Möglichkeit, die Delphi-Botschaft zu verbreiten und die erstaunlichen Dinge hervorzuheben, die Delphi-Entwickler jeden Tag erledigen! Wir wissen, dass Sie mit Delphi mehr erreichen als Teams, die um ein Vielfaches größer sind.
Geben Sie die Details für Ihren Showcase-Eintrag an, einschließlich eines YouTube-Videos, eines Website-Links, eines Twitter-Handles, einer Beschreibung, Screenshots und einer Aufnahme Ihrer in der IDE entwickelten App!
Kein Twitter Account? Kein Problem, wir werden Ihren Eintrag trotzdem veröffentlichen .
Wie und retweet Ihre Vorlage auf Twitter folgen Sie der # Delphi26th hashtag und ermutigen Sie Ihre Freunde und Anhänger , es auch zu mögen und retweet!
Like und retweete alle Einträge, die dich inspirieren !
Am 17. Februar 2021 wird Embarcadero die Gewinner des Hauptpreises mit den meisten Likes bekannt geben!
Stellen Sie sicher, dass Sie ein Delphi-Logo auf Ihrer Website einfügen und einen Link zur Delphi-Produktseite erstellen !
Voraussetzungen für die Einreichung von Präsentationen:
Der Showcase-Eintrag muss 6 Bilder (1080p oder bessere Auflösung) enthalten, einschließlich Screenshots, Logos, der App in der IDE usw. und optional ein Video, das die Anwendung in Aktion zeigt. Alle Bilder und Videos müssen auf einem modernen (in den letzten 5 Jahren veröffentlichten) Betriebssystem ausgeführt sein. Wenn die Anwendung keine Benutzeroberfläche hat, sind auch ein Screenshot der Anwendung in der IDE und Bilder, die zeigen, was sie tut, akzeptabel.
Die Anwendung muss in einer Version von Delphi ab 10 Seattle oder neuer geschrieben sein.
Die Anwendung muss von einem der folgenden Typen sein
Eine Open-Source-Anwendung, die auf GitHub, BitBucket, Sourceforge, GitLab, Redmine oder Assembla mit öffentlicher Sichtbarkeit und mindestens 50 Followern, Uhren, Sternen, Rezensionen, wöchentlichen Downloads usw. gehostet wird. Das Repository oder die zugehörige Website muss über ein Powered by Delphi verfügen Abzeichen und ein Link zur Embarcadero-Homepage oder zur Delphi-Produktseite.
Verfügbar für die breite Öffentlichkeit mit einer öffentlichen Website und Bewertungen auf mindestens zwei anderen seriösen Software-Websites.
Eine interne „Branchenanwendung“, die von einem Unternehmen mit der Erlaubnis verwendet wird, den Firmennamen im Schaufenster zu verwenden. Ein Vertreter des Unternehmens muss verfügbar sein, um zu überprüfen, ob der Antrag in Delphi verfasst ist.
Die Showcase-Geschenkkarte im Wert von 100 USD ist auf 200 Einreichungen beschränkt. Wenn mehr als 200 eingereicht werden, werden die 200 Gewinner von Embarcadero ausgewählt.
Die Geschenkkarte im Wert von 100 USD ist für 100 USD oder einen ungefähren Gegenwert in lokalen Währungen erhältlich. Die Geschenkkarte ist wahlweise bei Google Play, Apple oder Amazon erhältlich (jeder internationale Amazon hat einen begrenzten Versandbereich und nicht alle bieten Amazon-Geschenkkarten an).
Der Wettbewerb steht allen offen, die eine gültige Lizenz für Delphi oder RAD Studio ab Version 10 von Seattle besitzen.
Die endgültige Entscheidung über den Gewinn liegt im alleinigen Ermessen von Embarcadero. Nichtig, wo verboten, eingeschränkt oder eingeschränkt.
Fri Jan 29 2021 22:06:00 GMT+0700 (Western Indonesia Time)
IPWorks Encrypt Library enables you to encrypt and decrypt files, emails, documents, and messages through major cryptographic standards, including S/MIME, OpenPGP, TripleDES, TwoFish, RSA, AES, etc. Complete with X.509 and OpenPGP certificate management.
With these cryptographic components, you can achieve high-security features over your Delphi and C++ Builder applications. IPWorks Encryption Library can secure message hashing, message signing, and signature verification, as well as digital certificate generation and management.
procedure TFormJws.btnVerifyClick(Sender: TObject);
begin
ipcJWS1.Reset();
if (CompareStr(cboAlgorithm.Text,'HS256') = 0) or (CompareStr(cboAlgorithm.Text,'HS384') = 0) or (CompareStr(cboAlgorithm.Text,'HS512') = 0) then
begin
ipcJWS1.Config('KeyEncoding=1');
ipcJWS1.Key:=txtKey.Text;
end
else if (CompareStr(cboAlgorithm.Text,'RS256') = 0) or (CompareStr(cboAlgorithm.Text,'RS384') = 0) or (CompareStr(cboAlgorithm.Text,'RS512') = 0) or
(CompareStr(cboAlgorithm.Text,'PS256') = 0) or (CompareStr(cboAlgorithm.Text,'PS384') = 0) or (CompareStr(cboAlgorithm.Text,'PS512') = 0) then
begin
ipcJWS1.CertStoreType:=cstPEMKeyFile;
ipcJWS1.CertStore:=txtPublicFile.Text;
ipcJWS1.CertSubject:='*';
end
else if (CompareStr(cboAlgorithm.Text,'ES256') = 0) or (CompareStr(cboAlgorithm.Text,'ES384') = 0) or (CompareStr(cboAlgorithm.Text,'ES512') = 0) then
begin
ipcJWS1.CertStoreType:=cstPublicKeyFile;
ipcJWS1.CertStore:=txtPublicFile.Text;
ipcJWS1.CertSubject:='*';
end;
ipcJWS1.InputMessage:=txtSigned.Text;
ipcJWS1.Verify();
txtMessage.Text:=ipcJWS1.OutputMessage;
txtSigned.Text:='';
end;
Support for SHA1, SHA2 (SHA-224, SHA-256, SHA-384, SHA-512), ChaCha, JWE, MD2, MD4, MD5, RIPEMD160, MD5SHA1, and HMAC (MD5, SHA1, SHA2) signature hash algorithms.
Encrypt/decrypt, sign, and verify message signatures using S/MIME or OpenPGP, and digital certificates.
Support for JSON Web Signatures (JWS) and JSON Web Encryption (JWE) for signing/verifying and encrypting/decrypting data in respective standard formats.
Thu Jan 28 2021 19:00:59 GMT+0700 (Western Indonesia Time)
The lessons we have learned during the past 12 months have demonstrated that the ability to respond to and bounce back from adversity in general, can impact the short-and long-term success of any organization. It can even dictate the leaders and laggards in any industry.
When we take into consideration that as security threats also become more daunting, with many organizations remaining in a remote work environment, global organizations must reach a state where their core operations and services are not disrupted by unexpected changes.
The key to success in surviving any unforeseen circumstances in 2021, will be operational resiliency. Operational resilience is the ability to sustain business operations during any major event, including a cyberattack. It requires a strategic and holistic view of what could go wrong and how an organization will respond. Consider the risk and response for a utility company, for example, an organization that relies on IoT data, or a manufacturer of medical supplies. While their approach may differ, the impact would be equally as devastating should their operational continuity be halted. In today’s digital world, preparing for cyber threats must be a strategic part of that plan just like any other form of continuity and disaster recovery.
Speaking with customers globally, we know they are not fully prepared to withstand a major cyber event. Whilst many firms have a disaster recovery plan on paper, nearly a quarter have never tested that plan and only 42 percent of global executives are confident their organization could recover from a major cyber event without it affecting their business.
It begins with Zero Trust. Zero Trust is based on three principles, verify explicitly, use least privilege access, and assume breach.
Verify explicitly
Rather than trust users or devices implicitly because they’re on the corporate network or VPN’ed into it, it is critical to assume zero trust and verify each transaction explicitly. This means enabling strong authentication and authorization based on all available data points, including user identity, location, device health, service or workload, data classification, and anomalies.
This starts with strong user authentication. Multi-factor authentication (MFA) is essential, but it’s time to move away from passwords plus SMS and voice calls as authentication factors. Bad actors are getting more sophisticated all the time, and they have found a number of ways to exploit the publicly switched telephone networks (PSTN) that SMS and voice calls use as well as some social engineering methods for getting these codes from users.
For most users on their mobile devices, we believe the right answer is passwordless with app-based authentication, like Microsoft Authenticator, or a hardware key combined with biometrics.
Least privileged access
Least privileged access means that when we do grant access, we grant the minimum level of access the user needs to complete their task, and only for the amount of time they need it. Think about it this way, you can let someone into your building, but only during work hours, and you don’t let them into every lab and office.
Identity Governance allows you to balance your organization’s need for security and employee productivity with the right processes and visibility. It provides you with the capabilities to ensure that the right people have the right access to the right resources.
Assume breach
Finally, operate with the expectation of a breach, and apply techniques such as micro-segmentation and real-time analytics to detect attacks more quickly.
In a Zero Trust model, identities—whether they represent people, services, or IoT devices—define the control plane in which access decisions are made. Digital identities, such as transport layer security (TLS) and code signing certificates, SSH keys, secrets, and other cryptographic assets are critical to authentication, signing, and encryption.
That’s why having a strong identity is the critical first step to the success of a Zero Trust security approach.
Embracing Zero Trust allows organizations to harden their defenses while providing employees access to critical data, even during a cyber event. That’s because identity is the foundation of any Zero Trust security strategy because it automatically blocks attacks through adaptive security policies; across users and the accounts, devices, apps, and networks they are using. Identity is the only system that connects all security solutions together so we have end-to-end visibility to prevent, detect, and respond to distributed and sophisticated attacks thanks to cloud technology.
In a Zero Trust model, identities—whether they represent people, services, or IoT devices—define the control plane in which access decisions are made. Digital identities, such as TLS and code signing certificates, SSH keys, secrets, and other cryptographic assets are critical to authentication, signing, and encryption.
“Human identities” such as passwords, biometrics, and other MFA are critical to identifying and authenticate humans. Being a Zero Trust organization also means pervasive use of multi-factor authentication—which we know prevents 99 percent of credential theft and other intelligent authentication methods that make accessing apps easier and more secure than traditional passwords.
Identity is both the foundation for Zero Trust and acts as a catalyst for digital transformation. It automatically blocks attacks through adaptive security policies. It lets people work whenever and wherever they want, using their favorite devices and applications.
That’s because Zero Trust security relies heavily on pervasive threat signals and insights. It is essential to connect the dots and provide greater visibility to prevent, detect and respond to distributed and sophisticated attacks.
Future-proofing your security posture
As security threats become more daunting and many organizations remain in a remote work environment, global organizations must reach a state where their core operations and services will not be disrupted by unexpected global changes.
To maintain operational resilience, organizations should be regularly evaluating their risk threshold. When we talk about risk, this should include an evaluation of an organization’s ability to effectively respond to changes in the crypto landscape, such as a CA compromise, algorithm deprecation, or quantum threats on the horizon.
Bottom line: organizations must have the ability to operationally execute the processes through a combination of human efforts and technology products and services. The ability to do something as simple as restoring from recent backups will be tested in every ransomware attack, and many organizations will fail this test—not because they are not backing up their systems, but because they haven’t tested the quality of their backup procedures or practiced for a cyber event.
Operational resilience guidelines call for demonstrating that concrete measures are in place to deliver resilient services and that both incident management and contingency plans have been tested. Our new normal means that risks are no longer limited to commonly recognized sources such as cybercriminals, malware, or even targeted attacks. Operational resilience is the necessary framework we must have in place in order to maintain business continuity during any unforeseen circumstances in the year ahead.
We want to help empower every organization on the planet by continuing to share our learnings to help you reach the state where core operations and services won’t be disrupted by geopolitical or socioeconomic events, natural disasters, or even cyber events.
To learn more about Microsoft Security solutions visit our website. Bookmark the Security blog to keep up with our expert coverage on security matters. Also, follow us at @MSFTSecurity for the latest news and updates on cybersecurity.
Thu Jan 28 2021 18:00:01 GMT+0700 (Western Indonesia Time)
Optimization refers to finding the set of inputs to an objective function that results in the maximum or minimum output from the objective function.
It is common to describe optimization problems in terms of local vs. global optimization.
Similarly, it is also common to describe optimization algorithms or search algorithms in terms of local vs. global search.
In this tutorial, you will discover the practical differences between local and global optimization.
After completing this tutorial, you will know:
Local optimization involves finding the optimal solution for a specific region of the search space, or the global optima for problems with no local optima.
Global optimization involves finding the optimal solution on problems that contain local optima.
How and when to use local and global search algorithms and how to use both methods in concert.
Let’s get started.
Local Optimization Versus Global Optimization Photo by Marco Verch, some rights reserved.
Tutorial Overview
This tutorial is divided into three parts; they are:
Local Optimization
Global Optimization
Local vs. Global Optimization
Local Optimization
A local optima is the extrema (minimum or maximum) of the objective function for a given region of the input space, e.g. a basin in a minimization problem.
… we seek a point that is only locally optimal, which means that it minimizes the objective function among feasible points that are near it …
An objective function may have many local optima, or it may have a single local optima, in which case the local optima is also the global optima.
Local Optimization: Locate the optima for an objective function from a starting point believed to contain the optima (e.g. a basin).
Local optimization or local search refers to searching for the local optima.
A local optimization algorithm, also called a local search algorithm, is an algorithm intended to locate a local optima. It is suited to traversing a given region of the search space and getting close to (or finding exactly) the extrema of the function in that region.
… local optimization methods are widely used in applications where there is value in finding a good point, if not the very best.
Local search algorithms typically operate on a single candidate solution and involve iteratively making small changes to the candidate solution and evaluating the change to see if it leads to an improvement and is taken as the new candidate solution.
A local optimization algorithm will locate the global optimum:
If the local optima is the global optima, or
If the region being searched contains the global optima.
These define the ideal use cases for using a local search algorithm.
There may be debate over what exactly constitutes a local search algorithm; nevertheless, three examples of local search algorithms using our definitions include:
Nelder-Mead Algorithm
BFGS Algorithm
Hill-Climbing Algorithm
Now that we are familiar with local optimization, let’s take a look at global optimization.
Global Optimization
A global optimum is the extrema (minimum or maximum) of the objective function for the entire input search space.
Global optimization, where the algorithm searches for the global optimum by employing mechanisms to search larger parts of the search space.
An objective function may have one or more than one global optima, and if more than one, it is referred to as a multimodal optimization problem and each optimum will have a different input and the same objective function evaluation.
Global Optimization: Locate the optima for an objective function that may contain local optima.
An objective function always has a global optima (otherwise we would not be interested in optimizing it), although it may also have local optima that have an objective function evaluation that is not as good as the global optima.
The global optima may be the same as the local optima, in which case it would be more appropriate to refer to the optimization problem as a local optimization, instead of global optimization.
The presence of the local optima is a major component of what defines the difficulty of a global optimization problem as it may be relatively easy to locate a local optima and relatively difficult to locate the global optima.
Global optimization or global search refers to searching for the global optima.
A global optimization algorithm, also called a global search algorithm, is intended to locate a global optima. It is suited to traversing the entire input search space and getting close to (or finding exactly) the extrema of the function.
Global optimization is used for problems with a small number of variables, where computing time is not critical, and the value of finding the true global solution is very high.
Global search algorithms may involve managing a single or a population of candidate solutions from which new candidate solutions are iteratively generated and evaluated to see if they result in an improvement and taken as the new working state.
There may be debate over what exactly constitutes a global search algorithm; nevertheless, three examples of global search algorithms using our definitions include:
Genetic Algorithm
Simulated Annealing
Particle Swarm Optimization
Now that we are familiar with global and local optimization, let’s compare and contrast the two.
Local vs. Global Optimization
Local and global search optimization algorithms solve different problems or answer different questions.
A local optimization algorithm should be used when you know that you are in the region of the global optima or that your objective function contains a single optima, e.g. unimodal.
A global optimization algorithm should be used when you know very little about the structure of the objective function response surface, or when you know that the function contains local optima.
Local optimization, where the algorithm may get stuck in a local optimum without finding a global optimum.
Applying a local search algorithm to a problem that requires a global search algorithm will deliver poor results as the local search will get caught (deceived) by local optima.
Local search: When you are in the region of the global optima.
Global search: When you know that there are local optima.
Local search algorithms often give computational complexity grantees related to locating the global optima, as long as the assumptions made by the algorithm hold.
Global search algorithms often give very few if any grantees about locating the global optima. As such, global search is often used on problems that are sufficiently difficult that “good” or “good enough” solutions are preferred over no solutions at all. This might mean relatively good local optima instead of the true global optima if locating the global optima is intractable.
It is often appropriate to re-run or re-start the algorithm multiple times and record the optima found by each run to give some confidence that relatively good solutions have been located.
Local search: For narrow problems where the global solution is required.
Global search: For broad problems where the global optima might be intractable.
We often know very little about the response surface for an objective function, e.g. whether a local or global search algorithm is most appropriate. Therefore, it may be desirable to establish a baseline in performance with a local search algorithm and then explore a global search algorithm to see if it can perform better. If it cannot, it may suggest that the problem is indeed unimodal or appropriate for a local search algorithm.
Best Practice: Establish a baseline with a local search then explore a global search on objective functions where little is known.
Local optimization is a simpler problem to solve than global optimization. As such, the vast majority of the research on mathematical optimization has been focused on local search techniques.
A large fraction of the research on general nonlinear programming has focused on methods for local optimization, which as a consequence are well developed.
Global search algorithms are often coarse in their navigation of the search space.
Many population methods perform well in global search, being able to avoid local minima and finding the best regions of the design space. Unfortunately, these methods do not perform as well in local search in comparison to descent methods.
In this tutorial, you discovered the practical differences between local and global optimization.
Specifically, you learned:
Local optimization involves finding the optimal solution for a specific region of the search space, or the global optima for problems with no local optima.
Global optimization involves finding the optimal solution on problems that contain local optima.
How and when to use local and global search algorithms and how to use both methods in concert.
Do you have any questions?
Ask your questions in the comments below and I will do my best to answer.
Thu Jan 28 2021 05:22:10 GMT+0700 (Western Indonesia Time)
I’ll try to answer an age old question that I get asked all the time. How long does it take to learn Arabic?
Instead of relying on guesswork, I’ll base my answer on research and studies carried out in order to determine this.
First of all, when we say learn Arabic what do we mean? Because, the answer to our question greatly depends on the level of Arabic we are looking to reach.
The FSI Rating Scale
The FSI Absolute Language Proficiency rating is a pretty useful tool to determine the levels of language mastery. The person to be rated is interviewed by one or more trained testers, who are always native speakers. They converse with him for ten to twenty minutes, testing in mastery in pronunciation, grammar and vocabulary. They then pool their judgements and assign him a rating between 1 and 5.
Elementary proficiency: The person is able to satisfy basic travel needs and minimum courtesy requirements.
Limited working proficiency:The person is able to satisfy routine social demands and limited work requirements.
Minimum professional proficiency: The person can speak the language with sufficient structural accuracy and vocabulary to participate effectively in most formal and informal conversations on practical, social, and profession topics.
Full professional proficiency:The person uses the language fluently and accurately on all levels normally pertinent to professional needs.
Native or bilingual proficiency:The person has speaking proficiency equivalent to that of an educated native speaker
Study time for each level
Here are the estimates that the FSI gives for hard languages (which includes Arabic). Keep in mind that they classify Arabic as a hard language with respect to native English speakers. If you speak urdu for example which is much closer to Arabic, you will be able to reach these goals much quicker.
Source: How to learn a foreign language by Dr Paul Pimsleur
So to put things into perspective, say if you spend 2 hours a day for Arabic (this is the total time you spend for the language and can include activities like reviewing grammar, practicing with a native speaker / tutor, listening to the language, reviewing vocabulary etc) you can achieve level 2-2+ in just 6 months. With respect to learning classical Arabic, I would say that this level would mean being able to read the Quran and classical works, and starting to understanding a good deal of it, with the occational help of a dictionary.
2 hours might seem to be a lot, but this can include listening to Arabic content in your car while you commute or have lunch. This can include spending time with a person who speaks the language (listening and talking to him).
Also, if you are not in a hurry, or have very limited free time, you can work towards the same goal at a much more relaxed pace. Just remember to have your goals in clearly written out, and to make a system, and stick to it.
Thu Jan 28 2021 01:00:04 GMT+0700 (Western Indonesia Time)
Movie Collectorは、DVD / Blu-rayコレクションをカタログ化するための映画データベースソフトウェアで、Delphiによって構築されています。このソフトウェアは、映画、書籍、音楽、コミック、ゲームをカタログ化するためのデスクトップソフトウェア製品「Collectorz.com Suite」の一部です。同社のWebサイトに紹介されている機能情報によれば、さまざまなレイアウトとビューで、映画コレクションを表示、ソート、検索できるほか、DVDとBlu-Rayをタイトルやバーコードごとにデータベースへ簡単に追加することができます。さらに、フォルダスキャンによる映画ファイルの整理、バックアップ/同期/共有などをサポートする無料のCLZクラウドストレージなども用意されています。デスクトップバージョンには、WindowsとMacの双方のバージョンがあります。ライトテーマとダークテーマの両方をサポートしているのに加え、クラウド同期やIMDb経由の検索などのオプションを提供も用意されています。印象的なソフトウェアです。
Thu Jan 28 2021 00:05:23 GMT+0700 (Western Indonesia Time)
Разработчик Michal Mutl имеет мощное программное обеспечение сетевого сканера и инструмент сетевого обнаружения, доступные для Windows, и он построен на Delphi. Согласно сайту, это «бесплатный многопоточный сканер ICMP, портов, IP, NetBIOS, ActiveDirectory и SNMP со многими расширенными функциями. Он предназначен как для системных администраторов, так и для обычных пользователей, интересующихся компьютерной безопасностью. Программа выполняет пинг. развертка, сканирование на предмет открытых портов TCP и UDP, общих ресурсов и служб. Для устройств с поддержкой SNMP обнаруживаются доступные интерфейсы и отображаются основные свойства. Кроме того, вы должны редактировать результаты, сохранять / загружать результаты в / из CSV и распечатывать список сетевых устройств и любые данные в любом разделе могут быть экспортированы в CSV. Он также может разрешать имена хостов и автоматически определять ваш локальный диапазон IP. » Это действительно мощный инструмент для обнаружения топографии вашей сети и исследования компьютерной безопасности. Это отличный пример широты возможностей, доступных разработчику в среде Delphi. Помимо всех мощных функций, приложение действительно отлично выглядит со встроенным переключателем тем.
Thu Jan 28 2021 00:05:03 GMT+0700 (Western Indonesia Time)
O desenvolvedor Michal Mutl tem um poderoso software de varredura de rede e ferramenta de descoberta de rede disponível para Windows e é construído em Delphi. De acordo com o site, “é um scanner multi-threaded ICMP, Port, IP, NetBIOS, ActiveDirectory e SNMP com muitos recursos avançados. Destina-se a administradores de sistema e usuários em geral interessados em segurança de computador. O programa executa ping varredura, verifica as portas TCP e UDP abertas, compartilhamentos de recursos e serviços. Para dispositivos com capacidade SNMP, as interfaces disponíveis são detectadas e as propriedades básicas exibidas. Além disso, você deve editar os resultados, salvar / carregar os resultados de / para CSV e imprimir a lista de dispositivos de rede e todos os dados em qualquer seção podem ser exportados para CSV. Ele também pode resolver nomes de host e detectar automaticamente o intervalo de IP local. ” Esta é realmente uma ferramenta poderosa para descobrir a topografia de sua rede e investigar a segurança do computador. É um ótimo exemplo da amplitude de recursos disponíveis para um desenvolvedor no ambiente Delphi. Além de todos os recursos poderosos, o aplicativo realmente parece ótimo com um alternador de tema integrado.
Thu Jan 28 2021 00:04:16 GMT+0700 (Western Indonesia Time)
El desarrollador Michal Mutl tiene un potente software de escáner de red y una herramienta de descubrimiento de redes disponibles para Windows y está integrado en Delphi. Según el sitio, “es un escáner ICMP, Port, IP, NetBIOS, ActiveDirectory y SNMP multiproceso gratuito con muchas funciones avanzadas. Está destinado tanto a administradores de sistemas como a usuarios en general interesados en la seguridad informática. El programa realiza ping barrido, escaneos en busca de puertos TCP y UDP abiertos, recursos compartidos y servicios. Para dispositivos con capacidad SNMP, se detectan las interfaces disponibles y se muestran las propiedades básicas. Además, debe editar los resultados, guardar / cargar los resultados a / desde CSV e imprimir la lista de dispositivos de red y cualquier dato en cualquier sección se puede exportar a CSV. También puede resolver nombres de host y detectar automáticamente su rango de IP local “. Esta es realmente una herramienta poderosa para descubrir la topografía de su red e investigar la seguridad informática. Es un gran ejemplo de la amplitud de capacidades disponibles para un desarrollador en el entorno Delphi. Además de todas las potentes funciones, la aplicación también se ve muy bien con un selector de temas incorporado.
Thu Jan 28 2021 00:03:50 GMT+0700 (Western Indonesia Time)
Der Entwickler Michal Mutl hat eine leistungsfähige Netzwerkscanner-Software und ein Netzwerkerkennungs-Tool für Windows entwickelt, das in Delphi erstellt wurde. Laut der Website ist es „ein kostenloser Multi-Threaded ICMP, Port, IP, NetBIOS, ActiveDirectory und SNMP Scanner mit vielen erweiterten Funktionen. Es ist sowohl für Systemadministratoren als auch für allgemeine Benutzer gedacht, die an Computersicherheit interessiert sind. Das Programm führt einen Ping-Sweep durch, scannt nach geöffneten TCP- und UDP-Ports, Ressourcenfreigaben und Diensten. Für Geräte mit SNMP-Fähigkeit werden vorhandene Schnittstellen erkannt und grundlegende Eigenschaften angezeigt. Außerdem können Sie die Ergebnisse bearbeiten, die Ergebnisse in/aus CSV speichern/laden und die Liste der Netzwerkgeräte ausdrucken, und alle Daten in jedem Abschnitt können in CSV exportiert werden. Es kann auch Hostnamen auflösen und Ihren lokalen IP-Bereich automatisch erkennen.“ Dies ist wirklich ein mächtiges Werkzeug, um die Topographie Ihres Netzwerks zu entdecken und die Computersicherheit zu untersuchen. Es ist ein großartiges Beispiel für die Breite der Möglichkeiten, die einem Entwickler in der Delphi-Umgebung zur Verfügung stehen. Zusätzlich zu all den leistungsstarken Funktionen sieht die App mit dem eingebauten Theme Switcher auch noch richtig gut aus.
このブログ記事では、利用可能なサービスについては説明しませんが、RAD Studioからこのサービスを利用する方法にフォーカスし、 今回は無償でオープンなREST countries APIと、特別なジオロケーションサービスの1つを使用した例を紹介いたします。
REST Countries APIの使用
まずapilayerサービスを探索するための手始めとして、REST Countries APIを試したいと思います。このサービスは、https://github.com/apilayer/restcountriesでドキュメントとして提供され、シンプルかつ全て無償で利用可能です。このサービスをRAD Studioで付属しているRESTデバッガを使用し、クエリ実行を試してみました。名前のエンドポイントを使用し、オプションでパラメータを渡しています(パラメータ値は「united」)
Tue Jan 26 2021 18:00:20 GMT+0700 (Western Indonesia Time)
Developing a neural network predictive model for a new dataset can be challenging.
One approach is to first inspect the dataset and develop ideas for what models might work, then explore the learning dynamics of simple models on the dataset, then finally develop and tune a model for the dataset with a robust test harness.
This process can be used to develop effective neural network models for classification and regression predictive modeling problems.
In this tutorial, you will discover how to develop a Multilayer Perceptron neural network model for the Swedish car insurance regression dataset.
After completing this tutorial, you will know:
How to load and summarize the Swedish car insurance dataset and use the results to suggest data preparations and model configurations to use.
How to explore the learning dynamics of simple MLP models and data transforms on the dataset.
How to develop robust estimates of model performance, tune model performance, and make predictions on new data.
Let’s get started.
How to Develop a Neural Net for Predicting Car Insurance Payout Photo by Dimitry B., some rights reserved.
Tutorial Overview
This tutorial is divided into four parts; they are:
Auto Insurance Regression Dataset
First MLP and Learning Dynamics
Evaluating and Tuning MLP Models
Final Model and Make Predictions
Auto Insurance Regression Dataset
The first step is to define and explore the dataset.
We will be working with the “Auto Insurance” standard regression dataset.
The dataset describes Swedish car insurance. There is a single input variable, which is the number of claims, and the target variable is a total payment for the claims in thousands of Swedish krona. The goal is to predict the total payment given the number of claims.
You can see the first few rows of the dataset below.
108,392.5
19,46.2
13,15.7
124,422.2
40,119.4
...
We can see that the values are numeric and may range from tens to hundreds. This suggests some type of scaling would be appropriate for the data when modeling with a neural network.
We can load the dataset as a pandas DataFrame directly from the URL; for example:
# load the dataset and summarize the shape
from pandas import read_csv
# define the location of the dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv'
# load the dataset
df = read_csv(url, header=None)
# summarize shape
print(df.shape)
Running the example loads the dataset directly from the URL and reports the shape of the dataset.
In this case, we can confirm that the dataset has two variables (one input and one output) and that the dataset has 63 rows of data.
This is not many rows of data for a neural network and suggests that a small network, perhaps with regularization, would be appropriate.
It also suggests that using k-fold cross-validation would be a good idea given that it will give a more reliable estimate of model performance than a train/test split and because a single model will fit in seconds instead of hours or days with the largest datasets.
(63, 2)
Next, we can learn more about the dataset by looking at summary statistics and a plot of the data.
# show summary statistics and plots of the dataset
from pandas import read_csv
from matplotlib import pyplot
# define the location of the dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv'
# load the dataset
df = read_csv(url, header=None)
# show summary statistics
print(df.describe())
# plot histograms
df.hist()
pyplot.show()
Running the example first loads the data before and then prints summary statistics for each variable
We can see that the mean value for each variable is in the tens, with values ranging from 0 to the hundreds. This confirms that scaling the data is probably a good idea.
0 1
count 63.000000 63.000000
mean 22.904762 98.187302
std 23.351946 87.327553
min 0.000000 0.000000
25% 7.500000 38.850000
50% 14.000000 73.400000
75% 29.000000 140.000000
max 124.000000 422.200000
A histogram plot is then created for each variable.
We can see that each variable has a similar distribution. It looks like a skewed Gaussian distribution or an exponential distribution.
We may have some benefit in using a power transform on each variable in order to make the probability distribution less skewed, which will likely improve model performance.
Histograms of the Auto Insurance Regression Dataset
Now that we are familiar with the dataset, let’s explore how we might develop a neural network model.
First MLP and Learning Dynamics
We will develop a Multilayer Perceptron (MLP) model for the dataset using TensorFlow.
We cannot know what model architecture of learning hyperparameters would be good or best for this dataset, so we must experiment and discover what works well.
Given that the dataset is small, a small batch size is probably a good idea, e.g. 8 or 16 rows. Using the Adam version of stochastic gradient descent is a good idea when getting started as it will automatically adapt the learning rate and works well on most datasets.
Before we evaluate models in earnest, it is a good idea to review the learning dynamics and tune the model architecture and learning configuration until we have stable learning dynamics, then look at getting the most out of the model.
We can do this by using a simple train/test split of the data and review plots of the learning curves. This will help us see if we are over-learning or under-learning; then we can adapt the configuration accordingly.
First, we can split the dataset into input and output variables, then into 67/33 train and test sets.
...
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# split into train and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
Next, we can define a minimal MLP model. In this case, we will use one hidden layer with 10 nodes and one output layer (chosen arbitrarily). We will use the ReLU activation function in the hidden layer and the “he_normal” weight initialization, as together, they are a good practice.
The output of the model is a linear activation (no activation) and we will minimize mean squared error (MSE) loss.
...
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(1))
# compile the model
model.compile(optimizer='adam', loss='mse')
We will fit the model for 100 training epochs (chosen arbitrarily) with a batch size of eight because it is a small dataset.
We are fitting the model on raw data, which we think might be a bad idea, but it is an important starting point.
...
# fit the model
history = model.fit(X_train, y_train, epochs=100, batch_size=8, verbose=0, validation_data=(X_test,y_test))
At the end of training, we will evaluate the model’s performance on the test dataset and report performance as the mean absolute error (MAE), which I typically prefer over MSE or RMSE.
...
# predict test set
yhat = model.predict(X_test)
# evaluate predictions
score = mean_absolute_error(y_test, yhat)
print('MAE: %.3f' % score)
Finally, we will plot learning curves of the MSE loss on the train and test sets during training.
Tying this all together, the complete example of evaluating our first MLP on the auto insurance dataset is listed below.
# fit a simple mlp model and review learning curves
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# split into train and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(1))
# compile the model
model.compile(optimizer='adam', loss='mse')
# fit the model
history = model.fit(X_train, y_train, epochs=100, batch_size=8, verbose=0, validation_data=(X_test,y_test))
# predict test set
yhat = model.predict(X_test)
# evaluate predictions
score = mean_absolute_error(y_test, yhat)
print('MAE: %.3f' % score)
# plot learning curves
pyplot.title('Learning Curves')
pyplot.xlabel('Epoch')
pyplot.ylabel('Mean Squared Error')
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='val')
pyplot.legend()
pyplot.show()
Running the example first fits the model on the training dataset, then reports the MAE on the test dataset.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the model achieved a MAE of about 33.2, which is a good baseline in performance, which we might be able to improve upon.
MAE: 33.233
Line plots of the MSE on the train and test sets are then created.
We can see that the model has a good fit and converges nicely. The configuration of the model is a good starting point.
Learning Curves of Simple MLP on Auto Insurance Dataset
The learning dynamics are good so far, and the MAE is a rough estimate and should not be relied upon.
We can probably increase the capacity of the model a little and expect similar learning dynamics. For example, we can add a second hidden layer with eight nodes (chosen arbitrarily) and double the number of training epochs to 200.
...
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1))
# compile the model
model.compile(optimizer='adam', loss='mse')
# fit the model
history = model.fit(X_train, y_train, epochs=200, batch_size=8, verbose=0, validation_data=(X_test,y_test))
The complete example is listed below.
# fit a deeper mlp model and review learning curves
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# split into train and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1))
# compile the model
model.compile(optimizer='adam', loss='mse')
# fit the model
history = model.fit(X_train, y_train, epochs=200, batch_size=8, verbose=0, validation_data=(X_test,y_test))
# predict test set
yhat = model.predict(X_test)
# evaluate predictions
score = mean_absolute_error(y_test, yhat)
print('MAE: %.3f' % score)
# plot learning curves
pyplot.title('Learning Curves')
pyplot.xlabel('Epoch')
pyplot.ylabel('Mean Squared Error')
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='val')
pyplot.legend()
pyplot.show()
Running the example first fits the model on the training dataset, then reports the MAE on the test dataset.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see a slight improvement in MAE to about 27.9, although the high variance of the train/test split means that this evaluation is not reliable.
MAE: 27.939
Learning curves for the MSE train and test sets are then plotted. We can see that, as expected, the model achieves a good fit and convergences within a reasonable number of iterations.
Learning Curves of Deeper MLP on Auto Insurance Dataset
Finally, we can try transforming the data and see how this impacts the learning dynamics.
In this case, we will use a power transform to make the data distribution less skewed. This will also automatically standardize the variables so that they have a mean of zero and a standard deviation of one — a good practice when modeling with a neural network.
First, we must ensure that the target variable is a two-dimensional array.
...
# ensure that the target variable is a 2d array
y_train, y_test = y_train.reshape((len(y_train),1)), y_test.reshape((len(y_test),1))
Next, we can apply a PowerTransformer to the input and target variables.
This can be achieved by first fitting the transform on the training data, then transforming the train and test sets.
This process is applied separately for the input and output variables to avoid data leakage.
...
# power transform input data
pt1 = PowerTransformer()
pt1.fit(X_train)
X_train = pt1.transform(X_train)
X_test = pt1.transform(X_test)
# power transform output data
pt2 = PowerTransformer()
pt2.fit(y_train)
y_train = pt2.transform(y_train)
y_test = pt2.transform(y_test)
The data is then used to fit the model.
The transform can then be inverted on the predictions made by the model and the expected target values from the test set and we can calculate the MAE in the correct scale as before.
Tying this together, the complete example of fitting and evaluating an MLP with transformed data and creating learning curves of the model is listed below.
# fit a mlp model with data transforms and review learning curves
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
from sklearn.preprocessing import PowerTransformer
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# split into train and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
# ensure that the target variable is a 2d array
y_train, y_test = y_train.reshape((len(y_train),1)), y_test.reshape((len(y_test),1))
# power transform input data
pt1 = PowerTransformer()
pt1.fit(X_train)
X_train = pt1.transform(X_train)
X_test = pt1.transform(X_test)
# power transform output data
pt2 = PowerTransformer()
pt2.fit(y_train)
y_train = pt2.transform(y_train)
y_test = pt2.transform(y_test)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1))
# compile the model
model.compile(optimizer='adam', loss='mse')
# fit the model
history = model.fit(X_train, y_train, epochs=200, batch_size=8, verbose=0, validation_data=(X_test,y_test))
# predict test set
yhat = model.predict(X_test)
# inverse transforms on target variable
y_test = pt2.inverse_transform(y_test)
yhat = pt2.inverse_transform(yhat)
# evaluate predictions
score = mean_absolute_error(y_test, yhat)
print('MAE: %.3f' % score)
# plot learning curves
pyplot.title('Learning Curves')
pyplot.xlabel('Epoch')
pyplot.ylabel('Mean Squared Error')
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='val')
pyplot.legend()
pyplot.show()
Running the example first fits the model on the training dataset, then reports the MAE on the test dataset.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, the model achieves a reasonable MAE score, although worse than the performance reported previously. We will ignore model performance for now.
MAE: 34.320
Line plots of the learning curves are created showing that the model achieved a reasonable fit and had more than enough time to converge.
Learning Curves of Deeper MLP With Data Transforms on the Auto Insurance Dataset
Now that we have some idea of the learning dynamics for simple MLP models with and without data transforms, we can look at evaluating the performance of the models as well as tuning the configuration of the models.
This is because k models must be fit and evaluated. This is not a problem when the dataset size is small, such as the auto insurance dataset.
We can use the KFold class to create the splits and enumerate each fold manually, fit the model, evaluate it, and then report the mean of the evaluation scores at the end of the procedure.
# prepare cross validation
kfold = KFold(10)
# enumerate splits
scores = list()
for train_ix, test_ix in kfold.split(X, y):
# fit and evaluate the model...
...
...
# summarize all scores
print('Mean MAE: %.3f (%.3f)' % (mean(scores), std(scores)))
We can use this framework to develop a reliable estimate of MLP model performance with a range of different data preparations, model architectures, and learning configurations.
It is important that we first developed an understanding of the learning dynamics of the model on the dataset in the previous section before using k-fold cross-validation to estimate the performance. If we started to tune the model directly, we might get good results, but if not, we might have no idea of why, e.g. that the model was over or under fitting.
If we make large changes to the model again, it is a good idea to go back and confirm that model is converging appropriately.
The complete example of this framework to evaluate the base MLP model from the previous section is listed below.
# k-fold cross-validation of base model for the auto insurance regression dataset
from numpy import mean
from numpy import std
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.metrics import mean_absolute_error
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# prepare cross validation
kfold = KFold(10)
# enumerate splits
scores = list()
for train_ix, test_ix in kfold.split(X, y):
# split data
X_train, X_test, y_train, y_test = X[train_ix], X[test_ix], y[train_ix], y[test_ix]
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(1))
# compile the model
model.compile(optimizer='adam', loss='mse')
# fit the model
model.fit(X_train, y_train, epochs=100, batch_size=8, verbose=0)
# predict test set
yhat = model.predict(X_test)
# evaluate predictions
score = mean_absolute_error(y_test, yhat)
print('>%.3f' % score)
scores.append(score)
# summarize all scores
print('Mean MAE: %.3f (%.3f)' % (mean(scores), std(scores)))
Running the example reports the model performance each iteration of the evaluation procedure and reports the mean and standard deviation of the MAE at the end of the run.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the MLP model achieved a MAE of about 38.913.
We will use this result as our baseline to see if we can achieve better performance.
First, let’s try evaluating a deeper model on the raw dataset to see if it performs any better than a baseline model.
...
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1))
# compile the model
model.compile(optimizer='adam', loss='mse')
# fit the model
model.fit(X_train, y_train, epochs=200, batch_size=8, verbose=0)
The complete example is listed below.
# k-fold cross-validation of deeper model for the auto insurance regression dataset
from numpy import mean
from numpy import std
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.metrics import mean_absolute_error
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# prepare cross validation
kfold = KFold(10)
# enumerate splits
scores = list()
for train_ix, test_ix in kfold.split(X, y):
# split data
X_train, X_test, y_train, y_test = X[train_ix], X[test_ix], y[train_ix], y[test_ix]
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1))
# compile the model
model.compile(optimizer='adam', loss='mse')
# fit the model
model.fit(X_train, y_train, epochs=200, batch_size=8, verbose=0)
# predict test set
yhat = model.predict(X_test)
# evaluate predictions
score = mean_absolute_error(y_test, yhat)
print('>%.3f' % score)
scores.append(score)
# summarize all scores
print('Mean MAE: %.3f (%.3f)' % (mean(scores), std(scores)))
Running reports the mean and standard deviation of the MAE at the end of the run.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the MLP model achieved a MAE of about 35.384, which is slightly better than the baseline model that achieved an MAE of about 38.913.
Mean MAE: 35.384 (14.951)
Next, let’s try using the same model with a power transform for the input and target variables as we did in the previous section.
The complete example is listed below.
# k-fold cross-validation of deeper model with data transforms
from numpy import mean
from numpy import std
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.metrics import mean_absolute_error
from sklearn.preprocessing import PowerTransformer
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# prepare cross validation
kfold = KFold(10)
# enumerate splits
scores = list()
for train_ix, test_ix in kfold.split(X, y):
# split data
X_train, X_test, y_train, y_test = X[train_ix], X[test_ix], y[train_ix], y[test_ix]
# ensure target is a 2d array
y_train, y_test = y_train.reshape((len(y_train),1)), y_test.reshape((len(y_test),1))
# prepare input data
pt1 = PowerTransformer()
pt1.fit(X_train)
X_train = pt1.transform(X_train)
X_test = pt1.transform(X_test)
# prepare target
pt2 = PowerTransformer()
pt2.fit(y_train)
y_train = pt2.transform(y_train)
y_test = pt2.transform(y_test)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1))
# compile the model
model.compile(optimizer='adam', loss='mse')
# fit the model
model.fit(X_train, y_train, epochs=200, batch_size=8, verbose=0)
# predict test set
yhat = model.predict(X_test)
# inverse transforms
y_test = pt2.inverse_transform(y_test)
yhat = pt2.inverse_transform(yhat)
# evaluate predictions
score = mean_absolute_error(y_test, yhat)
print('>%.3f' % score)
scores.append(score)
# summarize all scores
print('Mean MAE: %.3f (%.3f)' % (mean(scores), std(scores)))
Running reports the mean and standard deviation of the MAE at the end of the run.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the MLP model achieved a MAE of about 37.371, which is better than the baseline model, but not better than the deeper baseline model.
Perhaps this transform is not as helpful as we initially thought.
Mean MAE: 37.371 (29.326)
An alternate transform is to normalize the input and target variables.
This means to scale the values of each variable to the range [0, 1]. We can achieve this using the MinMaxScaler; for example:
Tying this together, the complete example of evaluating the deeper MLP with data normalization is listed below.
# k-fold cross-validation of deeper model with normalization transforms
from numpy import mean
from numpy import std
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.metrics import mean_absolute_error
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# prepare cross validation
kfold = KFold(10)
# enumerate splits
scores = list()
for train_ix, test_ix in kfold.split(X, y):
# split data
X_train, X_test, y_train, y_test = X[train_ix], X[test_ix], y[train_ix], y[test_ix]
# ensure target is a 2d array
y_train, y_test = y_train.reshape((len(y_train),1)), y_test.reshape((len(y_test),1))
# prepare input data
pt1 = MinMaxScaler()
pt1.fit(X_train)
X_train = pt1.transform(X_train)
X_test = pt1.transform(X_test)
# prepare target
pt2 = MinMaxScaler()
pt2.fit(y_train)
y_train = pt2.transform(y_train)
y_test = pt2.transform(y_test)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1))
# compile the model
model.compile(optimizer='adam', loss='mse')
# fit the model
model.fit(X_train, y_train, epochs=200, batch_size=8, verbose=0)
# predict test set
yhat = model.predict(X_test)
# inverse transforms
y_test = pt2.inverse_transform(y_test)
yhat = pt2.inverse_transform(yhat)
# evaluate predictions
score = mean_absolute_error(y_test, yhat)
print('>%.3f' % score)
scores.append(score)
# summarize all scores
print('Mean MAE: %.3f (%.3f)' % (mean(scores), std(scores)))
Running reports the mean and standard deviation of the MAE at the end of the run.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the MLP model achieved a MAE of about 30.388, which is better than any other configuration we have tried so far.
Mean MAE: 30.388 (14.258)
We could continue to test alternate configurations to the model architecture (more or fewer nodes or layers), learning hyperparameters (more or fewer batches), and data transforms.
I leave this as an exercise; let me know what you discover. Can you get better results?
Post your results in the comments below, I’d love to see what you get.
Next, let’s look at how we might fit a final model and use it to make predictions.
Final Model and Make Predictions
Once we choose a model configuration, we can train a final model on all available data and use it to make predictions on new data.
In this case, we will use the deeper model with data normalization as our final model.
This means if we wanted to save the model to file, we would have to save the model itself (for making predictions), the transform for input data (for new input data), and the transform for target variable (for new predictions).
We can prepare the data and fit the model as before, although on the entire dataset instead of a training subset of the dataset.
...
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# ensure target is a 2d array
y = y.reshape((len(y),1))
# prepare input data
pt1 = MinMaxScaler()
pt1.fit(X)
X = pt1.transform(X)
# prepare target
pt2 = MinMaxScaler()
pt2.fit(y)
y = pt2.transform(y)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1))
# compile the model
model.compile(optimizer='adam', loss='mse')
We can then use this model to make predictions on new data.
First, we can define a row of new data, which is just one variable for this dataset.
...
# define a row of new data
row = [13]
We can then transform this new data ready to be used as input to the model.
...
# transform the input data
X_new = pt1.transform([row])
We can then make a prediction.
...
# make prediction
yhat = model.predict(X_new)
Then invert the transform on the prediction so we can use or interpret the result in the correct scale.
...
# invert transform on prediction
yhat = pt2.inverse_transform(yhat)
And in this case, we will simply report the prediction.
Tying this all together, the complete example of fitting a final model for the auto insurance dataset and using it to make a prediction on new data is listed below.
# fit a final model and make predictions on new data.
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.metrics import mean_absolute_error
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# ensure target is a 2d array
y = y.reshape((len(y),1))
# prepare input data
pt1 = MinMaxScaler()
pt1.fit(X)
X = pt1.transform(X)
# prepare target
pt2 = MinMaxScaler()
pt2.fit(y)
y = pt2.transform(y)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1))
# compile the model
model.compile(optimizer='adam', loss='mse')
# fit the model
model.fit(X, y, epochs=200, batch_size=8, verbose=0)
# define a row of new data
row = [13]
# transform the input data
X_new = pt1.transform([row])
# make prediction
yhat = model.predict(X_new)
# invert transform on prediction
yhat = pt2.inverse_transform(yhat)
# report prediction
print('f(%s) = %.3f' % (row, yhat[0]))
Running the example fits the model on the entire dataset and makes a prediction for a single row of new data.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that an input of 13 results in an output of 62 (thousand Swedish Krona).
f([13]) = 62.595
Further Reading
This section provides more resources on the topic if you are looking to go deeper.
Mon Jan 25 2021 01:00:00 GMT+0700 (Western Indonesia Time)
Lumicademyは、顧客が既存の製品やサービスに追加できるリアルタイム仮想クラスルーム体験を提供するPaaS(Platform as a Service)製品で、Delphi+FireMonkeyによって記述されています。既存のアプリケーションやサービスに、ライブビデオ会議やデスクトップ/ドキュメント共有機能を追加したいときは、APIとネイティブアプリエクスペリエンスを利用できます。Delphiを用いれば、開発者は、ネイティブコードのパフォーマンスに加え、すべての主要なデスクトップおよびモバイルプラットフォームをターゲットにできます。 Windows、macOS、iOS、Androidのそれぞれのプラットフォームで、最大のパフォーマンスが要求される領域ではアセンブリコードを容易にミックスすることができます。このプラットフォームでは、自社のサイトに統合してサービスを提供するようなプラットフォームパートナーも募集しています。教育関係者、教師、大学事務局、人材トレーナー、企業コンサルタント、トレーニング事業者、企業の開発者、システム管理者、SIなど、あらゆる業態に合わせて、Lumicademyは構築することができます。
Mon Jan 25 2021 00:03:26 GMT+0700 (Western Indonesia Time)
Как вы, возможно, видели в Интернете, Idera (материнская компания Embarcadero) недавно приобрела apilayer, компанию, предлагающую ряд микросервисов REST API, начиная от геолокации IP-адреса и заканчивая проверкой электронной почты и номера телефона, от финансовой информации до погоды и отслеживания рейсов. Вы можете найти список продуктов компании на https://apilayer.com/ . У каждого продукта есть собственный веб-сайт, на котором вы обычно можете войти в систему, используя ограниченное количество бесплатных вызовов REST.
В этом сообщении блога я не хочу обсуждать доступные службы, а сосредоточусь на том, как вызывать их из RAD Studio. Я буду использовать только две службы: бесплатный и открытый API стран REST и одну из их премиальных служб геолокации.
Использование API стран REST
Моя отправная точка для изучения сервисов apilayer — это простой и совершенно бесплатный сервис, доступный вместе с полной документацией на https://github.com/apilayer/restcountries . Чтобы провести первоначальный эксперимент, я использовал отладчик REST для запроса службы, используя конечную точку имени и, при необходимости, передав параметр, как вы можете видеть ниже (со значением параметра «объединено»):
После того, как данные в отладчике REST выглядят правильно, вы можете просто использовать кнопку «Копировать компоненты», чтобы сделать снимок конфигурации для компонента клиентской библиотеки REST, необходимого для создания приложения. Теперь создайте приложение Delphi или C ++ в RAD Studio, VCL или FMX, и вставьте компоненты в модуль данных — или форму, если вам лень. В этом случае я использовал Delphi и VCL… и мне было лень.
Я отбросил панель с редактированием, кнопкой и DBGrid (плюс компонент DataSource), подключил их и выполнил RESTRequest во время разработки, чтобы получить предварительный просмотр данных:
Код для фильтрации очень прост:
процедура TForm43.Button1Click (Отправитель: TObject);
начать,
если Edit1.Text = ”, то
RESTRequest1.Resource: = ‘name’
иначе
RESTRequest1.Resource: = ‘name /’ + Edit1.Text;
RESTRequest1.Execute;
конец;
Единственное другое изменение, которое мне пришлось сделать, — это изменить свойство TypesMode компонента RESTResponseDataSetAdapter1 на JSONOnly, так как часть анализа данных ошибочно пыталась преобразовать текст, связанный с часовым поясом, в дату, что привело к исключению.
Обратное геокодирование с помощью Position Stack API
Затем я попытался использовать бесплатный уровень платного API https://positionstack.com/ . Этот сервис предлагает прямое и обратное геокодирование, картографические сервисы и многое другое. Здесь, например, я выполнил простое «прямое» геокодирование, указав адрес и прочитав широту, долготу и другую локальную информацию в отладчике REST. Для получения табличного результата мне пришлось настроить корень JSON с помощью элемента данных :
В этом случае вам необходимо подписаться на ключ разработчика и ввести его в качестве дополнительного параметра запроса. (Возможно, вы захотите рассмотреть возможность кодирования этого ключа, а не использовать его в виде простой строки в конечном приложении.)
Теперь, аналогично тому, что я сделал выше, мы можем скопировать компоненты в приложение RAD Studio и получить готовое приложение FMX для геокодирования, на этот раз на основе Live Bindings. Также это приложение может отображать данные во время разработки, в данном случае широту и долготу моего города (плюс еще один город с таким же названием в США):
Заключение
Использование API-интерфейсов микросервисов для разработки приложений, как настольных, так и мобильных, действительно может ускорить создание и развертывание инновационных функций и одновременно разместить их в масштабируемой инфраструктуре. Я с нетерпением жду возможности использовать больше двухуровневых услуг и призываю вас взглянуть на то, что они могут предложить для ваших текущих или будущих проектов.
Mon Jan 25 2021 00:03:05 GMT+0700 (Western Indonesia Time)
Como você deve ter visto online, a Idera (controladora da Embarcadero) adquiriu recentemente a apilayer, uma empresa que oferece uma série de microsserviços de API REST, que vão desde geolocalização de endereços IP a e-mails e verificações de números de telefone, de informações financeiras a clima e rastreamento de voos. Você pode encontrar uma lista dos produtos da empresa em https://apilayer.com/ . Cada produto tem seu próprio site, onde geralmente você pode entrar para uma conta com um número limitado de chamadas REST gratuitas.
Nesta postagem do blog, não quero discutir os serviços disponíveis, mas me concentrar em como chamá-los do RAD Studio. Usarei apenas dois serviços, a API de países REST gratuita e aberta e um de seus serviços premium de geolocalização.
Usando a API de países REST
Meu ponto de partida para explorar os serviços de uma camada é um serviço simples e totalmente gratuito, disponível junto com a documentação completa em https://github.com/apilayer/restcountries . Para fazer um experimento inicial, usei o REST Debugger para consultar o serviço, usando o nome endpoint e opcionalmente passando um parâmetro, como você pode ver abaixo (com o valor do parâmetro “united”):
Assim que os dados parecerem corretos no Depurador REST, você pode simplesmente usar o botão Copiar Componentes para fazer um instantâneo da configuração do componente da Biblioteca do Cliente REST necessário para construir um aplicativo. Agora, crie um aplicativo Delphi ou C ++ no RAD Studio, seja VCL ou FMX, e cole os componentes em um módulo de dados – ou um formulário se você for preguiçoso. Neste caso, usei Delphi e VCL … e fui preguiçoso.
Eu soltei um painel com uma edição e um botão e DBGrid (mais um componente DataSource), conectei-os e executei o RESTRequest em tempo de design para obter uma visualização dos dados:
A única outra alteração que tive de fazer foi alterar a propriedade TypesMode do componente RESTResponseDataSetAdapter1 para JSONOnly, já que parte da análise de dados estava tentando por engano converter algum texto relacionado ao fuso horário em uma data, resultando em uma exceção.
GeoCoding reverso com a API Position Stack
Em seguida, fiz uma tentativa de usar o nível gratuito de uma API paga, https://positionstack.com/ . Este serviço oferece geocodificação direta e inversa, serviços de mapeamento e muito mais. Aqui, por exemplo, fiz uma geocodificação “direta” simples, fornecendo um endereço e lendo a latitude, longitude e outras informações locais no Depurador REST. Para obter o resultado tabular, tive que configurar a raiz JSON usando o elemento de dados :
Nesse caso, você precisa se inscrever para uma chave de desenvolvedor e inseri-la como um parâmetro adicional para a solicitação. (Você pode querer considerar a codificação dessa chave em vez de tê-la como uma string simples no aplicativo final.)
Agora, de maneira semelhante ao que fiz acima, podemos copiar os componentes em um aplicativo RAD Studio e ter um aplicativo FMX de geocodificação pronto para uso, desta vez baseado em Live Bindings. Além disso, este aplicativo pode exibir dados em tempo de design, neste caso a latitude e longitude da minha cidade (mais outra cidade com o mesmo nome nos EUA):
Conclusão
Aproveitar APIs de microsserviço para desenvolvimento de aplicativos, tanto para desktop quanto para dispositivos móveis, pode realmente acelerar a construção e implantação de recursos inovadores e colocá-los em uma infraestrutura escalonável ao mesmo tempo. Estou ansioso para aproveitar mais os serviços de uma camada e incentivá-lo a dar uma olhada no que eles podem oferecer para seus projetos atuais ou futuros.
Mon Jan 25 2021 00:02:11 GMT+0700 (Western Indonesia Time)
Como puede haber visto en línea, Idera (empresa matriz de Embarcadero) adquirió recientemente apilayer, una empresa que ofrece una serie de microservicios de API REST, que van desde la geolocalización de direcciones IP hasta la verificación de números de teléfono y correo electrónico, desde información financiera hasta seguimiento meteorológico y de vuelos. Puede encontrar una lista de los productos de la empresa en https://apilayer.com/ . Cada producto tiene su propio sitio web, donde generalmente puede iniciar sesión para obtener una cuenta con un número limitado de llamadas REST gratuitas.
En esta publicación de blog, no quiero discutir los servicios disponibles, pero me enfoco en cómo llamarlos desde RAD Studio. Usaré solo dos servicios, la API de países REST abierta y gratuita y uno de sus servicios premium de geolocalización.
Uso de la API de países REST
Mi punto de partida para explorar los servicios de apilayer es un servicio simple y totalmente gratuito, disponible junto con la documentación completa en https://github.com/apilayer/restcountries . Para hacer un experimento inicial, usé el depurador REST para consultar el servicio, usando el nombre del punto final y, opcionalmente, pasando un parámetro, como puede ver a continuación (con el valor del parámetro “unido”):
Una vez que los datos se vean correctos en el depurador REST, puede usar el botón Copiar componentes para hacer una instantánea de la configuración del componente de la biblioteca cliente REST requerido para construir una aplicación. Ahora, cree una aplicación Delphi o C ++ en RAD Studio, ya sea VCL o FMX, y pegue los componentes en un módulo de datos, o un formulario si es vago. En este caso he usado Delphi y VCL… y era vago.
Dejé caer un panel con una edición y un botón y DBGrid (más un componente DataSource), los conecté y ejecuté RESTRequest en tiempo de diseño para obtener una vista previa de los datos:
El único otro cambio que tuve que hacer fue cambiar la propiedad TypesMode del componente RESTResponseDataSetAdapter1 a JSONOnly, ya que algunos de los análisis de datos intentaban por error convertir un texto relacionado con la zona horaria en una fecha, lo que resultó en una excepción.
Geocodificación inversa con la API Position Stack
Luego intenté usar el nivel gratuito de una API paga, https://positionstack.com/ . Este servicio ofrece geocodificación directa e inversa, servicios de mapeo y más. Aquí, por ejemplo, he realizado una codificación geográfica “directa” simple, proporcionando una dirección y leyendo la latitud, la longitud y otra información local en el depurador REST. Para obtener el resultado tabular tuve que configurar la raíz JSON usando el elemento de datos :
En este caso, debe registrarse para obtener una clave de desarrollador e ingresarla como un parámetro adicional para la solicitud. (Es posible que desee considerar codificar esa clave en lugar de tenerla como una cadena simple en la aplicación final).
Ahora, de manera similar a lo que hice anteriormente, podemos copiar los componentes en una aplicación RAD Studio y tener una aplicación FMX de codificación geográfica lista para usar, esta vez basada en Live Bindings. Además, esta aplicación puede mostrar datos en tiempo de diseño, en este caso la latitud y longitud de mi ciudad (más otra ciudad con el mismo nombre en EE. UU.):
Conclusión
Aprovechar las API de microservicio para el desarrollo de aplicaciones, tanto de escritorio como móviles, realmente puede acelerar la creación y la implementación de funciones innovadoras, y tenerlas en una infraestructura escalable al mismo tiempo. Espero poder aprovechar más de los servicios de apilayer y le animo a que eche un vistazo a lo que pueden ofrecer para sus proyectos actuales o futuros.
Mon Jan 25 2021 00:01:51 GMT+0700 (Western Indonesia Time)
Wie Sie online gesehen haben, Idera (Embarcadero Muttergesellschaft) vor kurzem erworbener apilayer, ein Unternehmen , eine Reihe von REST API Mikro-Dienstleistungen anbieten, die von IP – Adresse Geolocation – E – Mail und prüft die Telefonnummer, von Finanzinformationen zu Wetter und Flugverfolgung. Eine Liste der Unternehmensprodukte finden Sie unter https://apilayer.com/ . Jedes Produkt verfügt über eine eigene Website, auf der Sie sich in der Regel für ein Konto mit einer begrenzten Anzahl kostenloser REST-Anrufe anmelden können.
In diesem Blog-Beitrag möchte ich nicht auf die verfügbaren Dienste eingehen, sondern mich darauf konzentrieren, wie sie von RAD Studio aus aufgerufen werden. Ich werde nur zwei Dienste verwenden, die kostenlose und offene REST-Länder-API und einen ihrer Premium-Geolokalisierungsdienste.
Verwenden der API für REST-Länder
Mein Ausgangspunkt für die Erkundung der Apilayer-Dienste ist ein einfacher und völlig kostenloser Dienst, der zusammen mit der vollständigen Dokumentation unter https://github.com/apilayer/restcountries verfügbar ist . Um ein erstes Experiment durchzuführen, habe ich den REST-Debugger verwendet, um den Service abzufragen, den Namensendpunkt zu verwenden und optional einen Parameter zu übergeben, wie Sie unten sehen können (mit dem Parameterwert „united“):
Sobald die Daten im REST-Debugger korrekt angezeigt werden, können Sie einfach über die Schaltfläche Komponenten kopieren einen Schnappschuss der Konfiguration für die REST-Clientbibliothekskomponente erstellen, die zum Erstellen einer Anwendung erforderlich ist. Erstellen Sie jetzt eine Delphi- oder C ++ – Anwendung in RAD Studio, entweder VCL oder FMX, und fügen Sie die Komponenten in ein Datenmodul ein – oder in ein Formular, wenn Sie faul sind. In diesem Fall habe ich Delphi und VCL verwendet… und ich war faul.
Ich habe ein Panel mit einer Bearbeitung und einer Schaltfläche und DBGrid (plus einer DataSource-Komponente) gelöscht, sie verkabelt und die RESTRequest zur Entwurfszeit ausgeführt, um eine Vorschau der Daten zu erhalten:
Die einzige andere Änderung, die ich vornehmen musste, war die Änderung der TypesMode-Eigenschaft der RESTResponseDataSetAdapter1-Komponente in JSONOnly, da bei einigen Datenanalysen fälschlicherweise versucht wurde, zeitzonenbezogenen Text in ein Datum zu konvertieren, was zu einer Ausnahme führte.
Reverse GeoCoding mit der Position Stack API
Als nächstes habe ich versucht, die kostenlose Version einer kostenpflichtigen API ( https://positionstack.com/) zu verwenden . Dieser Dienst bietet direkte und inverse Geokodierung, Kartierungsdienste und mehr. Hier habe ich zum Beispiel eine einfache „Vorwärts“ -Geocodierung durchgeführt, eine Adresse angegeben und den Breiten-, Längen- und anderen lokalen Informationen im REST-Debugger gelesen. Um das tabellarische Ergebnis zu erhalten, musste ich den JSON-Stamm mit dem Datenelement konfigurieren :
In diesem Fall müssen Sie sich für einen Entwicklerschlüssel anmelden und diesen als zusätzlichen Parameter für die Anforderung eingeben. (Möglicherweise möchten Sie diesen Schlüssel codieren, anstatt ihn in der endgültigen Anwendung als einfache Zeichenfolge zu verwenden.)
Ähnlich wie oben können wir jetzt die Komponenten in eine RAD Studio-Anwendung kopieren und eine geokodierte FMX-App verwenden, diesmal basierend auf Live-Bindungen. Diese App kann auch Daten zur Entwurfszeit anzeigen, in diesem Fall den Breiten- und Längengrad meiner Stadt (plus eine andere Stadt mit demselben Namen in den USA):
Fazit
Durch die Nutzung von Micro-Service-APIs für die Anwendungsentwicklung, sowohl auf dem Desktop als auch auf dem Handy, kann der Aufbau und die Bereitstellung innovativer Funktionen erheblich beschleunigt und gleichzeitig auf einer skalierbaren Infrastruktur bereitgestellt werden. Ich freue mich darauf, mehr von den Apilayer-Diensten zu nutzen und Sie zu ermutigen, einen Blick darauf zu werfen, was sie für Ihre aktuellen zukünftigen Projekte bieten können.
Sun Jan 24 2021 18:00:14 GMT+0700 (Western Indonesia Time)
Last Updated on January 29, 2021
The Nelder-Mead optimization algorithm is a widely used approach for non-differentiable objective functions.
As such, it is generally referred to as a pattern search algorithm and is used as a local or global search procedure, challenging nonlinear and potentially noisy and multimodal function optimization problems.
In this tutorial, you will discover the Nelder-Mead optimization algorithm.
After completing this tutorial, you will know:
The Nelder-Mead optimization algorithm is a type of pattern search that does not use function gradients.
How to apply the Nelder-Mead algorithm for function optimization in Python.
How to interpret the results of the Nelder-Mead algorithm on noisy and multimodal objective functions.
Let’s get started.
How to Use the Nelder-Mead Optimization in Python Photo by Don Graham, some rights reserved.
Tutorial Overview
This tutorial is divided into three parts; they are:
The algorithm was described in their 1965 paper titled “A Simplex Method For Function Minimization” and has become a standard and widely used technique for function optimization.
It is appropriate for one-dimensional or multidimensional functions with numerical inputs.
Nelder-Mead is a pattern search optimization algorithm, which means it does not require or use function gradient information and is appropriate for optimization problems where the gradient of the function is unknown or cannot be reasonably computed.
It is often used for multidimensional nonlinear function optimization problems, although it can get stuck in local optima.
Practical performance of the Nelder–Mead algorithm is often reasonable, though stagnation has been observed to occur at nonoptimal points. Restarting can be used when stagnation is detected.
A starting point must be provided to the algorithm, which may be the endpoint of another global optimization algorithm or a random point drawn from the domain.
Given that the algorithm may get stuck, it may benefit from multiple restarts with different starting points.
The Nelder-Mead simplex method uses a simplex to traverse the space in search of a minimum.
The algorithm works by using a shape structure (called a simplex) composed of n + 1 points (vertices), where n is the number of input dimensions to the function.
For example, on a two-dimensional problem that may be plotted as a surface, the shape structure would be composed of three points represented as a triangle.
The Nelder-Mead method uses a series of rules that dictate how the simplex is updated based on evaluations of the objective function at its vertices.
The points of the shape structure are evaluated and simple rules are used to decide how to move the points of the shape based on their relative evaluation. This includes operations such as “reflection,” “expansion,” “contraction,” and “shrinkage” of the simplex shape on the surface of the objective function.
In a single iteration of the Nelder–Mead algorithm, we seek to remove the vertex with the worst function value and replace it with another point with a better value. The new point is obtained by reflecting, expanding, or contracting the simplex along the line joining the worst vertex with the centroid of the remaining vertices. If we cannot find a better point in this manner, we retain only the vertex with the best function value, and we shrink the simplex by moving all other vertices toward this value.
The search stops when the points converge on an optimum, when a minimum difference between evaluations is observed, or when a maximum number of function evaluations are performed.
Now that we have a high-level idea of how the algorithm works, let’s look at how we might use it in practice.
Nelder-Mead Example in Python
The Nelder-Mead optimization algorithm can be used in Python via the minimize() function.
This function requires that the “method” argument be set to “nelder-mead” to use the Nelder-Mead algorithm. It takes the objective function to be minimized and an initial point for the search.
...
# perform the search
result = minimize(objective, pt, method='nelder-mead')
The result is an OptimizeResult object that contains information about the result of the optimization accessible via keys.
For example, the “success” boolean indicates whether the search was completed successfully or not, the “message” provides a human-readable message about the success or failure of the search, and the “nfev” key indicates the number of function evaluations that were performed.
Importantly, the “x” key specifies the input values that indicate the optima found by the search, if successful.
...
# summarize the result
print('Status : %s' % result['message'])
print('Total Evaluations: %d' % result['nfev'])
print('Solution: %s' % result['x'])
We can demonstrate the Nelder-Mead optimization algorithm on a well-behaved function to show that it can quickly and efficiently find the optima without using any derivative information from the function.
In this case, we will use the x^2 function in two-dimensions, defined in the range -5.0 to 5.0 with the known optima at [0.0, 0.0].
We can define the objective() function below.
# objective function
def objective(x):
return x[0]**2.0 + x[1]**2.0
We will use a random point in the defined domain as a starting point for the search.
...
# define range for input
r_min, r_max = -5.0, 5.0
# define the starting point as a random sample from the domain
pt = r_min + rand(2) * (r_max - r_min)
The search can then be performed. We use the default maximum number of function evaluations set via the “maxiter” and set to N*200, where N is the number of input variables, which is two in this case, e.g. 400 evaluations.
...
# perform the search
result = minimize(objective, pt, method='nelder-mead')
After the search is finished, we will report the total function evaluations used to find the optima and the success message of the search, which we expect to be positive in this case.
...
# summarize the result
print('Status : %s' % result['message'])
print('Total Evaluations: %d' % result['nfev'])
Finally, we will retrieve the input values for located optima, evaluate it using the objective function, and report both in a human-readable manner.
Tying this together, the complete example of using the Nelder-Mead optimization algorithm on a simple convex objective function is listed below.
# nelder-mead optimization of a convex function
from scipy.optimize import minimize
from numpy.random import rand
# objective function
def objective(x):
return x[0]**2.0 + x[1]**2.0
# define range for input
r_min, r_max = -5.0, 5.0
# define the starting point as a random sample from the domain
pt = r_min + rand(2) * (r_max - r_min)
# perform the search
result = minimize(objective, pt, method='nelder-mead')
# summarize the result
print('Status : %s' % result['message'])
print('Total Evaluations: %d' % result['nfev'])
# evaluate solution
solution = result['x']
evaluation = objective(solution)
print('Solution: f(%s) = %.5f' % (solution, evaluation))
Running the example executes the optimization, then reports the results.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the search was successful, as we expected, and was completed after 88 function evaluations.
We can see that the optima was located with inputs very close to [0,0], which evaluates to the minimum objective value of 0.0.
Now that we have seen how to use the Nelder-Mead optimization algorithm successfully, let’s look at some examples where it does not perform so well.
Nelder-Mead on Challenging Functions
The Nelder-Mead optimization algorithm works well for a range of challenging nonlinear and non-differentiable objective functions.
Nevertheless, it can get stuck on multimodal optimization problems and noisy problems.
To make this concrete, let’s look at an example of each.
Noisy Optimization Problem
A noisy objective function is a function that gives different answers each time the same input is evaluated.
We can make an objective function artificially noisy by adding small Gaussian random numbers to the inputs prior to their evaluation.
For example, we can define a one-dimensional version of the x^2 function and use the randn() function to add small Gaussian random numbers to the input with a mean of 0.0 and a standard deviation of 0.3.
# objective function
def objective(x):
return (x + randn(len(x))*0.3)**2.0
The noise will make the function challenging to optimize for the algorithm and it will very likely not locate the optima at x=0.0.
The complete example of using Nelder-Mead to optimize the noisy objective function is listed below.
# nelder-mead optimization of noisy one-dimensional convex function
from scipy.optimize import minimize
from numpy.random import rand
from numpy.random import randn
# objective function
def objective(x):
return (x + randn(len(x))*0.3)**2.0
# define range for input
r_min, r_max = -5.0, 5.0
# define the starting point as a random sample from the domain
pt = r_min + rand(1) * (r_max - r_min)
# perform the search
result = minimize(objective, pt, method='nelder-mead')
# summarize the result
print('Status : %s' % result['message'])
print('Total Evaluations: %d' % result['nfev'])
# evaluate solution
solution = result['x']
evaluation = objective(solution)
print('Solution: f(%s) = %.5f' % (solution, evaluation))
Running the example executes the optimization, then reports the results.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, the algorithm does not converge and instead uses the maximum number of function evaluations, which is 200.
Status: Maximum number of function evaluations has been exceeded.
Total Evaluations: 200
Solution: f([-0.6918238]) = 0.79431
The algorithm may converge on some runs of the code but will arrive on a point away from the optima.
Multimodal Optimization Problem
Many nonlinear objective functions may have multiple optima, referred to as multimodal problems.
The problem may be structured such that it has multiple global optima that have an equivalent function evaluation, or a single global optima and multiple local optima where algorithms like the Nelder-Mead can get stuck in search of the local optima.
The Ackley function is an example of the latter. It is a two-dimensional objective function that has a global optima at [0,0] but has many local optima.
The example below implements the Ackley and creates a three-dimensional plot showing the global optima and multiple local optima.
# ackley multimodal function
from numpy import arange
from numpy import exp
from numpy import sqrt
from numpy import cos
from numpy import e
from numpy import pi
from numpy import meshgrid
from matplotlib import pyplot
from mpl_toolkits.mplot3d import Axes3D
# objective function
def objective(x, y):
return -20.0 * exp(-0.2 * sqrt(0.5 * (x**2 + y**2))) - exp(0.5 * (cos(2 * pi * x) + cos(2 * pi * y))) + e + 20
# define range for input
r_min, r_max = -5.0, 5.0
# sample input range uniformly at 0.1 increments
xaxis = arange(r_min, r_max, 0.1)
yaxis = arange(r_min, r_max, 0.1)
# create a mesh from the axis
x, y = meshgrid(xaxis, yaxis)
# compute targets
results = objective(x, y)
# create a surface plot with the jet color scheme
figure = pyplot.figure()
axis = figure.gca(projection='3d')
axis.plot_surface(x, y, results, cmap='jet')
# show the plot
pyplot.show()
Running the example creates the surface plot of the Ackley function showing the vast number of local optima.
3D Surface Plot of the Ackley Multimodal Function
We would expect the Nelder-Mead function to get stuck in one of the local optima while in search of the global optima.
Initially, when the simplex is large, the algorithm may jump over many local optima, but as it contracts, it will get stuck.
We can explore this with the example below that demonstrates the Nelder-Mead algorithm on the Ackley function.
# nelder-mead for multimodal function optimization
from scipy.optimize import minimize
from numpy.random import rand
from numpy import exp
from numpy import sqrt
from numpy import cos
from numpy import e
from numpy import pi
# objective function
def objective(v):
x, y = v
return -20.0 * exp(-0.2 * sqrt(0.5 * (x**2 + y**2))) - exp(0.5 * (cos(2 * pi * x) + cos(2 * pi * y))) + e + 20
# define range for input
r_min, r_max = -5.0, 5.0
# define the starting point as a random sample from the domain
pt = r_min + rand(2) * (r_max - r_min)
# perform the search
result = minimize(objective, pt, method='nelder-mead')
# summarize the result
print('Status : %s' % result['message'])
print('Total Evaluations: %d' % result['nfev'])
# evaluate solution
solution = result['x']
evaluation = objective(solution)
print('Solution: f(%s) = %.5f' % (solution, evaluation))
Running the example executes the optimization, then reports the results.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that the search completed successfully but did not locate the global optima. It got stuck and found a local optima.
Each time we run the example, we will find a different local optima given the different random starting point for the search.
Fri Jan 22 2021 01:00:00 GMT+0700 (Western Indonesia Time)
Node 14 became the LTS version, while Node 15 became the Current version from October 2020! As an odd-numbered release line, Node.js 15 will not be promoted to LTS.
In this article below, you'll find changelogs and download / update information regarding Node.js!
Node.js v15 arrived and became the Current version!
Some features delivered in Node.js 15:
AbortController: AbortController is a global utility class used to signal cancelation in selected Promise-based APIs, based on the AbortController Web API.
N-API Version 7: N-API 7 brings additional methods for working with ArrayBuffers.
npm 7: npm 7 comes with many new features like npm workspaces and a new package-lock.json format. npm 7 includes yarn.lock file support. Peer dependencies are now installed by default.
Throw on unhandled rejections: As of Node.js 15, the default mode for unhandledRejection is changed to throw (from warn). In throw mode, if an unhandledRejection hook is not set, the unhandledRejection is raised as an uncaught exception. Users that have an unhandledRejection hook should see no change in behavior, and it’s still possible to switch modes using the --unhandled-rejections=mode process flag.
QUIC (experimental): QUIC is a UDP-based, underlying transport protocol for HTTP/3. QUIC features inbuilt security with TLS 1.3, flow control, error correction, connection migration, and multiplexing. QUIC can be enabled by compiling Node.js with the --experimental-quic configuration flag. The Node.js QUIC implementation is exposed by the core net module.
V8 8.6: The V8 JavaScript engine has been updated to V8 8.6 (V8 8.4 is the latest available in Node.js 14). Along with performance tweaks and improvements the V8 update also brings the following language features:
Promise.any() (from V8 8.5)
AggregateError (from V8 8.5)
String.prototype.replaceAll() (from V8 8.5)
Logical assignment operators &&=, ||=, and ??= (from V8 8.5)
set lifo as the default scheduling strategy in Agent
net:
support abortSignal in server.listen
process:
add direct access to rss without iterating pages
v8:
fix native serdes constructors
Changelog for Node v15.5.1 (Current)
This is a security release. Vulnerabilities fixed:
CVE-2020-8265: use-after-free in TLSWrap (High): Affected Node.js versions are vulnerable to a use-after-free bug in its TLS implementation. When writing to a TLS enabled socket, node::StreamBase::Write calls node::TLSWrap::DoWrite with a freshly allocated WriteWrap object as first argument. If the DoWrite method does not return an error, this object is passed back to the caller as part of a StreamWriteResult structure. This may be exploited to corrupt memory leading to a Denial of Service or potentially other exploits.
CVE-2020-8287: HTTP Request Smuggling in nodejs (Low): Affected versions of Node.js allow two copies of a header field in a http request. For example, two Transfer-Encoding header fields. In this case Node.js identifies the first header field and ignores the second. This can lead to HTTP Request Smuggling.
Changelog for Node v15.5.0 (Current)
OpenSSL-1.1.1i: OpenSSL-1.1.1i contains a fix for CVE-2020-1971: OpenSSL - EDIPARTYNAME NULL pointer de-reference (High). This is a vulnerability in OpenSSL which may be exploited through Node.js.
Extended support for AbortSignal in child_process and stream:
The following APIs now support an AbortSignal in their options object:
child_process.spawn(): Calling .abort() on the corresponding AbortController is similar to calling .kill() on the child process except the error passed to the callback will be an AbortError
new stream.Writable() and new stream.Readable(): Calling .abort() on the corresponding AbortController will behave the same way as calling .destroy(new AbortError()) on the stream
BigInt support in querystring.stringify():
If querystring.stringify() is called with an object that contains BigInt values, they will now be serialized to their decimal representation instead of the empty string.
Additions to the C++ embedder APIs:
A new IsolateSettingsFlag is available for those calling SetIsolateUpForNode() : SHOULD_NOT_SET_PREPARE_STACK_TRACE_CALLBACK can be used to prevent Node.js from setting a custom callback to prepare stack traces.
stream: add FileHandle support to Read/WriteStream
worker: add experimental BroadcastChannel
Changelog for Node v15.3.0 (Current)
dns: add a cancel() method to the promise Resolver
events: add max listener warning for EventTarget
http: add support for abortsignal to http.request
http2: allow setting the local window size of a session
lib: add throws option to fs.f/l/statSync
path: add path/posix and path/win32 alias modules
readline: add getPrompt to get the current prompt
src: add loop idle time in diagnostic report
util: add util/types alias module
Changelog for Node v15.2.0 (Current)
events: getEventListeners static
fs: support abortsignal in writeFile, add support for AbortSignal in readFile
stream: fix thrown object reference
Changelog for Node v15.1.0 (Current)
Diagnostics channel (experimental module):diagnostics_channel is a new experimental module that provides an API to create named channels to report arbitrary message data for diagnostics purposes. With diagnostics_channel, Node.js core and module authors can publish contextual data about what they are doing at a given time. This could be the hostname and query string of a mysql query, for example.
New child process 'spawn' event: Instances of ChildProcess now emit a new 'spawn' event once the child process has spawned successfully. If emitted, the 'spawn' event comes before all other events and before any data is received via stdout or stderr. The 'spawn' event will fire regardless of whether an error occurs within the spawned process. For example, if bash some-command spawns successfully, the 'spawn' event will fire, though bash may fail to spawn some-command. This caveat also applies when using { shell: true }.
Set the local address for DNS resolution: It is now possible to set the local IP address used by a Resolver instance to send its requests. This allows programs to specify outbound interfaces when used on multi-homed systems. The resolver will use the v4 local address when making requests to IPv4 DNS servers, and the v6 local address when making requests to IPv6 DNS servers.
Control V8 coverage at runtime: The v8 module includes two new methods to control the V8 coverage started by the NODE_V8_COVERAGE environment variable. With v8.takeCoverage(), it is possible to write a coverage report to disk on demand. This can be done multiple times during the lifetime of the process, and the execution counter will be reset on each call. When the process is about to exit, one last coverage will still be written to disk, unless v8.stopCoverage() was invoked before. The v8.stopCoverage() method allows to stop the coverage collection, so that V8 can release the execution counters and optimize code.
Analyze Worker's event loop utilization:Worker instances now have a performance property, with a single eventLoopUtilization method that can be used to gather information about the worker's event loop utilization between the 'online' and 'exit' events. The method works the same way as perf_hookseventLoopUtilization().
Take a V8 heap snapshot just before running out of memory (experimental):
With the new --heapsnapshot-near-heap-limit=max_count experimental command line flag, it is now possible to automatically generate a heap snapshot when the V8 heap usage is approaching the heap limit. count should be a non-negative integer (in which case Node.js will write no more than max_count snapshots to disk). When generating snapshots, garbage collection may be triggered and bring the heap usage down, therefore multiple snapshots may be written to disk before the Node.js instance finally runs out of memory. These heap snapshots can be compared to determine what objects are being allocated during the time consecutive snapshots are taken.
The highlights in this release include improved diagnostics, an upgrade of V8, an experimental Async Local Storage API, hardening of the streams APIs, removal of the Experimental Modules warning, and the removal of some long deprecated APIs.
Node.js 14 was promoted to Long-term Support (LTS) in October 2020. As a reminder — both Node.js 12 and Node.js 10 will remain in long-term support until April 2022 and April 2021 respectively.
Node.js LTS v14 Changelogs
Changelog for Node v14.15.4 (Current)
This is a security release. Vulnerabilities fixed:
CVE-2020-1971: OpenSSL - EDIPARTYNAME NULL pointer de-reference (High): This is a vulnerability in OpenSSL which may be exploited through Node.js.
CVE-2020-8265: use-after-free in TLSWrap (High): Affected Node.js versions are vulnerable to a use-after-free bug in its TLS implementation. When writing to a TLS enabled socket, node::StreamBase::Write calls node::TLSWrap::DoWrite with a freshly allocated WriteWrap object as first argument. If the DoWrite method does not return an error, this object is passed back to the caller as part of a StreamWriteResult structure. This may be exploited to corrupt memory leading to a Denial of Service or potentially other exploits.
CVE-2020-8287: HTTP Request Smuggling in nodejs (Low): Affected versions of Node.js allow two copies of a header field in a http request. For example, two Transfer-Encoding header fields. In this case Node.js identifies the first header field and ignores the second. This can lead to HTTP Request Smuggling
Changelog for Node v14.15.3 (Current)
Node.js v14.15.2 included a commit that has caused reported breakages when cloning request objects. This release reverts the commit that introduced the behaviour change. See https://github.com/nodejs/node/issues/36550 for more details.
Changelog for Node v14.15.2 (Current)
deps: upgrade npm to 6.14.9
deps: update acorn to v8.0.4
doc: add release key for Danielle Adams
http2: check write not scheduled in scope destructor
stream: fix regression on duplex end
Changelog for Node v14.15.1 (Current)
This is a security release. Vulnerabilities fixed:
CVE-2020-8277: Denial of Service through DNS request (High). A Node.js application that allows an attacker to trigger a DNS request for a host of their choice could trigger a Denial of Service by getting the application to resolve a DNS record with a larger number of responses.
Changelog for Node v14.15.0 (Current)
This release marks the transition of Node.js 14.x into Long Term Support (LTS) with the codename 'Fermium'. The 14.x release line now moves into "Active LTS" and will remain so until October 2021. After that time, it will move into "Maintenance" until end of life in April 2023.
doc: add missing link in Node.js 14 Changelog
doc: fix Node.js 14.x changelogs
Revert "test: mark test-webcrypto-encrypt-decrypt-aes flaky"
Changelog for Node v14.14.0 (Current)
crypto: update certdata to NSS 3.56
doc: add aduh95 to collaborators
fs: add rm method
http: allow passing array of key/val into writeHead
src: expose v8::Isolate setup callbacks
Changelog for Node v14.13.1 (Current)
fs: remove experimental from rmdir recursive
Changelog for Node v14.13.0 (Current)
deps: upgrade to libuv 1.40.0
module: named exports for CJS via static analysis
module: exports pattern support
src: allow N-API addon in AddLinkedBinding()
Changelog for Node v14.12.0 (Current)
deps:
update to uvwasi 0.0.11
n-api:
create N-API version 7
add more property defaults
Changelog for Node v14.11.0 (Current)
This is a security release. Vulnerabilities fixed:
Denial of Service by resource exhaustion CWE-400 due to unfinished HTTP/1.1 requests.
HTTP Request Smuggling due to CR-to-Hyphen conversion.
Changelog for Node v14.10.1 (Current)
Node.js 14.10.0 included a streams regression with async generators and a docs rendering regression that are being fixed in this release.
Changelog for Node v14.10.0 (Current)
buffer: also alias BigUInt methods
crypto: add randomInt function
perf_hooks: add idleTime and event loop util
stream: simpler and faster Readable async iterator
worker: (SEMVER-MINOR) add option to track unmanaged file descriptors
Changelog for Node v14.5.0 (Current)
V8 engine is updated to version 8.3
This version includes performance improvements and now allows WebAssembly modules to request memories up to 4GB in size. For more information, have a look at the official V8 blog post.
Initial experimental implementation of EventTarget
This version introduces an new experimental API EventTarget, which provides a DOM interface implemented by objects that can receive events and may have listeners for them. It is an adaptation of the Web API EventTarget.
Changelog for Node v14.4.0 (Current)
This is a security release. Vulnerabilities fixed:
CVE-2020-8172: TLS session reuse can lead to host certificate verification bypass (High).
CVE-2020-11080: HTTP/2 Large Settings Frame DoS (Low).
CVE-2020-8174:napi_get_value_string_*() allows various kinds of memory corruption (High).
Changelog for Node v14.3.0 (Current)
REPL previews improvements with autocompletion: The output preview is changed to generate previews for autocompleted input instead of the actual input. Pressing <enter> during a preview is now going to evaluate the whole string including the autocompleted part. Pressing <escape> cancels that behavior.
Support for Top-Level Await: It's now possible to use the await keyword outside of async functions, with the --experimental-top-level-await flag.
Changelog for Node v14.2.0 (Current)
Track function calls with assert.CallTracker:assert.CallTracker is a new experimental API that allows to track and later verify the number of times a function was called.
Console groupIndentation option: The Console constructor (require('console').Console) now supports different group indentations.
Changelog for Node v14.1.0 (Current)
deps: upgrade openssl sources to 1.1.1g
doc: add juanarbol as collaborator
http: doc deprecate abort and improve docs
module: do not warn when accessing __esModule of unfinished exports
n-api: detect deadlocks in thread-safe function
src: deprecate embedder APIs with replacements
stream:
don't emit end after close
don't wait for close on legacy streams
pipeline should only destroy un-finished streams
vm: add importModuleDynamically option to compileFunction
Changelog for Node v14.0.0 (Current)
Deprecations:
(SEMVER-MAJOR) crypto: move pbkdf2 without digest to EOL
(SEMVER-MAJOR) fs: deprecate closing FileHandle on garbage collection
(SEMVER-MAJOR) http: move OutboundMessage.prototype.flush to EOL
(SEMVER-MAJOR) lib: move GLOBAL and root aliases to EOL
(SEMVER-MAJOR) os: move tmpDir() to EOL
(SEMVER-MAJOR) src: remove deprecated wasm type check
(SEMVER-MAJOR) stream: move _writableState.buffer to EOL
(SEMVER-MINOR) doc: deprecate process.mainModule
(SEMVER-MINOR) doc: deprecate process.umask() with no arguments
ECMAScript Modules - Experimental Warning Removal
In Node.js 13 we removed the need to include the --experimental-modules flag, but when running EcmaScript Modules in Node.js, this would still result in a warning ExperimentalWarning: The ESM module loader is experimental.
As of Node.js 14 there is no longer this warning when using ESM in Node.js. However, the ESM implementation in Node.js remains experimental. As per our stability index: “The feature is not subject to Semantic Versioning rules. Non-backward compatible changes or removal may occur in any future release.” Users should be cautious when using the feature in production environments.
The ESM implementation in Node.js is still experimental but we do believe that we are getting very close to being able to call ESM in Node.js “stable”. Removing the warning is a huge step in that direction.
New V8 ArrayBuffer API src: migrate to new V8 ArrayBuffer API. Multiple ArrayBuffers pointing to the same base address are no longer allowed by V8. This may impact native addons.
Toolchain and Compiler Upgrades
(SEMVER-MAJOR) build: update macos deployment target to 10.13 for 14.x
(SEMVER-MAJOR) doc: update cross compiler machine for Linux armv7
(SEMVER-MAJOR) doc: update Centos/RHEL releases use devtoolset-8
(SEMVER-MAJOR) doc: remove SmartOS from official binaries
(SEMVER-MAJOR) win: block running on EOL Windows versions
It is expected that there will be an ABI mismatch on ARM between the Node.js binary and native addons. Native addons are only broken if they interact with std::shared_ptr. This is expected to be fixed in a later version of Node.js 14.
Update to V8 8.1 (SEMVER-MAJOR) deps: update V8 to 8.1.307.20
Enables Optional Chaining by default
Enables Nullish Coalescing by default
Enables Intl.DisplayNames by default
Enables calendar and numberingSystem options for Intl.DateTimeFormat by default
Other Notable Changes:
cli, report: move --report-on-fatalerror to stable
deps: upgrade to libuv 1.37.0
fs: add fs/promises alias module
Learn More Node.js from RisingStack
At RisingStack we've been writing JavaScript / Node tutorials for the community in the past 5 years. If you're beginner to Node.js, we recommend checking out our Node Hero tutorial series! The goal of this series is to help you get started with Node.js and make sure you understand how to write an application using it.
Thu Jan 21 2021 18:00:48 GMT+0700 (Western Indonesia Time)
Recommender systems may be the most common type of predictive model that the average person may encounter.
They provide the basis for recommendations on services such as Amazon, Spotify, and Youtube.
Recommender systems are a huge daunting topic if you’re just getting started. There is a myriad of data preparation techniques, algorithms, and model evaluation methods.
Not all of the techniques will be relevant, and in fact, the state-of-the-art can be ignored for now as you will likely get very good results by focusing on the fundamentals, e.g. treat it as a straightforward classification or regression problem.
It is important to know the basics and have it all laid out for you in a systematic way. For this, I recommend skimming or reading the standard books and papers on the topic and looking at some of the popular libraries.
In this tutorial, you will discover resources you can use to get started with recommender systems.
After completing this tutorial, you will know:
The top review papers on recommender systems you can use to quickly understand the state of the field.
The top books on recommender systems from which you can learn the algorithms and techniques required when developing and evaluating recommender systems.
The top Python libraries and APIs that you can use to prototype and develop your own recommender systems.
Let’s get started.
How to Get Started With Recommender Systems Photo by Paul Toogood, some right reserved.
Tutorial Overview
This tutorial is divided into three parts; they are:
Papers on Recommender Systems
Books on Recommender Systems
Recommender Systems Libraries
Papers on Recommender Systems
Research papers on recommender systems can help you very quickly get up to speed on the state of the field.
Specifically, review papers that use precise language to define what a recommender system is, the algorithms that can be used, standard datasets and metrics for comparing algorithms, and hints at the state of the art techniques.
By skimming or reading a handful of review papers on recommender systems, you can quickly develop a foundation from which to dive deeper and start developing your own systems.
The field does not change that quickly, and techniques from 10 or 20 years ago will give you solid results.
Review papers on recommender systems I recommended to establish a foundational understanding include:
Do you know of additional good review papers on recommender systems?
Let me know in the comments below.
Books on Recommender Systems
Books on recommender systems provide the space to lay out the field and take you on a tour of the techniques and give you the detail you need to understand them, with more breadth and detail than a much shorter review paper.
Again, given that the field is quite mature, older books, such as those published a decade ago, should not be immediately neglected.
Some top textbooks published by key researchers in the field include the following:
This book offers an overview of approaches to developing state-of-the-art recommender systems. The authors present current algorithmic approaches for generating personalized buying proposals, such as collaborative and content-based filtering, as well as more interactive and knowledge- based approaches. They also discuss how to measure the effectiveness of recommender systems and illustrate the methods with practical case studies.
The table of contents for this book is as follows:
Chapter 1: Introduction
Chapter 2: Collaborative recommendation
Chapter 3: Content-based recommendation
Chapter 4: Knowledge-based recommendation
Chapter 5: Hybrid recommendation approaches
Chapter 6: Explanations in recommender systems
Chapter 7: Evaluating recommender systems
Chapter 8: Case study: Personalized game recommendations on the mobile Internet
Chapter 9: Attacks on collaborative recommender systems
Chapter 10: Online consumer decision making
Chapter 11: Recommender systems and the next-generation web
Chapter 12: Recommendations in ubiquitous environments
Chapter 13: Summary and outlook
Recommender Systems: An Introduction
It can be good to get a handbook on the topic with chapters written by different academics summarizing or championing their preferred techniques and methods.
Have you read one of these books? Or do you know another great book on the topic?
Let me know in the comments below.
Recommender Systems Libraries
You probably don’t need to dive into the start of the art, at least not immediately.
As such, standard machine learning libraries are a great place to start.
For example, you can develop an effective recommender system using matrix factorization methods (SVD) or even a straight forward k-nearest neighbors model by items or by users.
As such, I recommend starting with some experiments with scikit-learn:
You can practice on standard recommender system datasets if your own data is not yet accessible or available, or you just want to get the hang of things first.
Popular standard datasets for recommender systems include:
If you are ready for state-of-the-art techniques, a great place to start is “papers with code” that lists both academic papers and links to the source code for the methods described in the paper:
Have you used any of these libraries to develop a recommender system?
Let me know in the comments below.
Summary
In this tutorial, you discovered resources you can use to get started with recommender systems.
Specifically, you learned:
The top review papers on recommender systems you can use to quickly understand the state of the field.
The top books on recommender systems from which you can learn the algorithms and techniques required when developing and evaluating recommender systems.
The top Python libraries and APIs that you can use to prototype and develop your own recommender systems.
Do you have any questions?
Ask your questions in the comments below and I will do my best to answer.
Wed Jan 20 2021 00:08:15 GMT+0700 (Western Indonesia Time)
Com o Change Views, você tem esse método patenteado para trabalhar que é muito mais fácil de desenvolver e escalar para sua base de clientes. Usando o InterBase Change Views, você agora pode identificar especificamente quais deltas foram alterados no nível do campo.
As visualizações de mudança são um modelo baseado em assinatura usado para assinar alguns dados e identificar quais dados foram alterados em seu banco de dados InterBase. Você cria uma assinatura que cobre diferentes tabelas e colunas e permite aos usuários o direito de assinar as alterações nos dados.
Durante uma conexão, você pode obter um alerta e, em seguida, buscar suas alterações delta ou usar um componente TFDEventAlerter no Delphi / C ++ Builder e até mesmo alterações específicas do código de cores. Para estender uma conexão, você não precisa estar conectado para registrar as alterações. Depois de iniciar uma transação de banco de dados, você pode ter uma assinatura ativa, desconectar-se do banco de dados e iniciar uma nova conexão com uma nova transação em um momento futuro.
Com o Change Views, você:
Reduza custos e E / S de disco, minimizando as sincronizações de dados
Têm pouco impacto no desempenho
Sem tabelas de log externas
Escalabilidade de usuários, mesmo os móveis
Acompanhe as mudanças da maneira que você quiser
Implementando Change Views com FireDAC
Confira este breve vídeo de 4 minutos sobre o uso de Alterar visualizações e como você pode começar a rastrear as alterações de dados.
Se quiser experimentar o uso de Change Views, você pode dar uma olhada no aplicativo de exemplo Generic Change Views que demonstrei acima, que vem com o Delphi.
Tue Jan 19 2021 23:52:00 GMT+0700 (Western Indonesia Time)
Cue Player One da Baxel Data é um programa para teatro para controlar som, vídeo, luzes e acessórios usando uma lista de cue, um computador, um operador e é construído em Delphi! A família Cue Player de software de nível profissional para teatro inclui Cue Player Premium e Cue Player Lighting. De acordo com a Baxel Data, seu software está em uso em mais de 1000 teatros, igrejas e escolas em todo o mundo. Baxel Data também afirma que “há muito mais grupos de teatro locais ou comunitários que precisavam de algo que pudessem ter em um laptop ou computador portátil que pudessem trazer para o local apenas para as apresentações.” O Cue Player One nasceu dessa necessidade, diz Baxel Data. Ele combina os recursos de som e iluminação de seu software principal em um programa e uma lista de sugestões. O Cue Player One possui integração profunda com unidades de hardware de teatro, como interfaces DMX para controlar a iluminação e superfícies MIDI.
Tue Jan 19 2021 23:18:41 GMT+0700 (Western Indonesia Time)
Knights Province es un juego de estrategia en tiempo real de la vieja escuela que enfatiza la estrategia y está construido en Delphi. El juego se encuentra actualmente en Alpha. Este juego es un trabajo de amor del desarrollador Krom, quien ha estado trabajando en el motor que usa durante ~ 12 años y el juego en sí durante ~ 6 años. Según el desarrollador, “a diferencia de muchos juegos de estrategia en tiempo real modernos, que son de ritmo rápido y a menudo se tratan más de tácticas, KP planeó enfatizar el componente de” estrategia “. Juego de ritmo más lento, construcción de bases, recopilación y procesamiento de recursos, en profundidad elecciones estratégicas, variedad de recursos y unidades, atención a los detalles “. Además, sobre la tecnología para construir el juego, el desarrollador dice “Knights Province se desarrolló en Delphi (Object Pascal) desde cero. Los gráficos están escritos según las especificaciones de OpenGL ES2.0. La plataforma de destino principal es Windows de escritorio. Sin embargo, no se ha probado, pero también debería funcionar bien con Wine en plataformas Linux y MacOS. El código es compatible y se ejecuta en Android también, aunque la GUI y los controles no están correctamente manipulados. El multijugador usará Overbyte ICS. Los efectos de sonido son OpenAL “. ¡Guau, impresionante logro, chicos!
Mon Jan 18 2021 07:48:14 GMT+0700 (Western Indonesia Time)
During my studies at ThePowerMBA, I had the opportunity to revisit the main concepts of the Blue Ocean strategy, which offers several tools for companies that want to improve their unique value proposition, by differentiating their products from the competition.
The goal is to apply the four actions in order to create a product that is very different from the competition. This product may be cheaper than the competition (because it eliminates and reduces several costs), but at the same time it should offer something unique (because it raises and creates some relevant factors).
Below I will explain in detail how we have applied each one of these four activities in my startup company KashKlik, and as a result we have created a very innovative product that is extremely different from the competition.
Example: KashKlik Influencer Marketing Platform
Eliminate:
Influencer Search: There are many platforms that enable the advertisers to search for influencers. On KashKlik, the advertisers cannot search for influencers. They simply create campaigns and define the targeting. Our algorithms automatically find the best influencers to promote each campaign.
Influencer Approval: On most platforms, the advertisers need to approve each influencer individually. On KashKlik, the advertisers do not need to approve the influencers. If the influencer satisfies the selection criteria that was defined in the campaign, then he/she can promote the campaign.
Negotiation with Influencer: In general influencers do not have fixed prices, and the advertisers need to negotiate with each influencer to define the amount to be paid for the promotion of the campaign. On KashKlik the advertisers do not need to negotiate with the influencers about the cost of the campaign. The advertiser pays a fixed value per-click to all the influencers promoting its campaign.
Post Approval: Many platforms require the advertisers to approve the contents of each post on the social networks. On KashKlik the advertisers do not need to approve individual posts. We trust the influencers based on the scores that were computed by our Machine Learning algorithms. The best influencers have higher scores.
Communication with Influencer: On other platforms, in order to negotiate payments and approve posts, the advertisers need to communicate directly with the influencers. On KashKlik there is no negotiation and no approval, so the advertisers do not need to communicate with the influencers.
Reduce:
Control Over Influencer Choice: On KashKlik, the advertisers have less control over the choice of influencers. The influencers are selected according to the targeting and profile requirements that are defined by the advertisers when the campaign is created.
Control Over the Contents of Posts: On KashKlik, the advertisers have less control over the influencers’ posts. The advertisers do provide examples of texts and images that may be used by the influencers to promote the campaign, but each influencer is free to use other contents that fit his/her audience.
Raise:
Campaign Management Efficiency: Because of all the features that were eliminated and replaced by automation, the KashKlik platform drastically reduces the amount of time and effort that the advertisers need to spend in order to create and manage their campaigns. Each campaign may start being promoted immediately after the advertiser has activated it. This is much more efficient than having to go over a process that requires direct communication between advertisers and influencers.
Audience Size Flexibility: KashKlik’s automation enables advertisers to work effectively with micro-influencers, who have audiences of less than 50 thousand followers. When there is no automation, it is not cost-effective to work with small influencers. Thus KashKlik provides more flexibility in the choice of audience sizes for each campaign.
Budget Size Flexibility: Thanks to KashKlik’s automation and the work with micro-influencers, it’s possible to create Influencer Marketing campaigns using budgets as low as a few hundred dollars. Traditional influencer marketing campaigns require budgets of tens of thousands of dollars. Thus KashKlik provides more flexibility in the choice of budget sizes for each campaign.
Machine Learning Application: There are several platforms that claim to use Machine Learning, but KashKlik raised the application of sophisticated algorithms to provide a new level of automation. KashKlik applies Machine Learning to create rich influencer profiles and to build an advanced Recommender System to match each campaign to the best influencers.
Scalability: Thanks to automation and the reduction in the time and effort required to promote the campaign, KashKlik makes it possible to promote a campaign using hundreds of micro-influencers simultaneously. Other platforms, that do not provide this level of automation, are not scalable.
Create:
Pay-Per-Click: KashKlik was a pioneer in the introduction of the Pay-Per-Click (PPC) model for Influencer Marketing. Most other platforms adopt the models of pay-per-post or pay-per-engagement. The adoption of PPC means in practice a very innovative combination of Influencer Marketing with Performance Marketing.
Influencers Choose Campaigns: KashKlik created a real marketplace that has inverted the relationship between advertisers and influencers. Instead of advertisers searching for influencers, on KashKlik the influencers search for campaigns.
Influencer Marketing for SMBs: Thanks to KashKlik’s reduction of the minimum budgets and the reduction of time and effort required to manage campaigns, the channel of Influencer Marketing became accessible to Small and Medium Businesses (SMBs). Previously, using traditional methods, which are very expensive and require lots of time and effort, SMBs could not afford to work with influencers.
As you can observe, as a result of the application of the four activities in the ERRC Grid, KashKlik has become one of the first Influencer Marketing platforms that addressed the SMBs market. In other words, we have created a Blue Ocean. I hope you have enjoyed this example. Please share your comments or questions below.
In a previous post I have shared a presentation and a video explaining how the application of these four activities have enabled KashKlik to create a new value curve that is very different from the competition.
In my next posts I intend to continue to share how the materials I’m learning at the ThePowerMBA can be directly applied to my startup company KashKlik. Please leave a comment if you would like me to address some specific topic. Thanks.
Fri Jan 15 2021 23:32:25 GMT+0700 (Western Indonesia Time)
Planet Fun — это 4D-симулятор солнечной системы для Android и iOS, созданный на Delphi. Положение планет рассчитывается с использованием эфемерид VSOP2013, по данным разработчика между 1500 и 3000 годами. Приложение создано с использованием функциональности FireMonkey 3D, и доступен полный исходный код. Среди его функций — анимация солнечной системы с настраиваемой скоростью, выбор цели камеры (Солнце или планеты), установка даты / времени между 1500 и 3000 годами, настраиваемое расстояние до цели, сенсорные жесты: панорамирование одним пальцем, масштабирование двумя пальцами, два вращение пальца, точки орбиты планеты плюс каждая орбита представлена 52 точками (для Земли — одна точка в неделю), гелиоцентрической осью (x и z), положениями планет с высоким разрешением VSOP2013, расчетами положения луны, звездным фоном с 42455 звездами Каталог входных данных Hipparcos использует датчики телефона (компас, гироскоп и GPS) для управления трехмерным положением телефона, а телефон в сцене позиционируется с помощью датчиков телефона (GPS, гироскоп и компас). Это забавное маленькое приложение, демонстрирующее хорошую реализацию кроссплатформенной реализации Delphi FireMonkey 3d.
Fri Jan 15 2021 23:32:08 GMT+0700 (Western Indonesia Time)
Planet Fun é uma simulação do sistema solar 4D para Android e iOS e é construído em Delphi. As posições dos planetas são calculadas usando efemérides VSOP2013, anos entre 1500 e 3000 de acordo com o desenvolvedor. O aplicativo é desenvolvido usando a funcionalidade FireMonkey 3D e o código-fonte completo está disponível. Entre seus recursos estão uma animação do sistema solar com velocidade configurável, escolha o alvo da câmera (Sol ou planetas), ajuste data / hora entre os anos 1500 e 3000, distância configurável até o alvo, gestos de toque: um dedo panorâmico, dois dedos zoom, dois rotação do dedo, pontos da órbita do planeta mais cada órbita é representada por 52 pontos (para a Terra, é um ponto por semana), eixo heliocêntrico (x e z), posições do planeta de alta resolução VSOP2013, cálculos da posição da lua, um fundo de estrela com 42455 estrelas do Catálogo de entrada Hipparcos, ele usa sensores de telefone (bússola, giroscópio e GPS) para controlar a atitude do telefone 3D, e o telefone na cena é posicionado com sensores de telefone (GPS, giroscópio e bússola). Este é um pequeno aplicativo divertido e mostra uma boa implementação de plataforma cruzada Delphi FireMonkey 3d.
Fri Jan 15 2021 23:31:41 GMT+0700 (Western Indonesia Time)
Planet Fun es una simulación del sistema solar 4D para Android e iOS y está construido en Delphi. Las posiciones de los planetas se calculan utilizando efemérides VSOP2013, años entre 1500 y 3000 según el desarrollador. La aplicación está construida con la funcionalidad FireMonkey 3D y el código fuente completo está disponible. Entre sus características se encuentran una animación del sistema solar con velocidad configurable, elegir el objetivo de la cámara (Sol o planetas), establecer fecha / hora entre los años 1500 y 3000, distancia al objetivo configurable, gestos táctiles: pan con un dedo, zoom con dos dedos, dos rotación de los dedos, puntos de la órbita del planeta más cada órbita está representada por 52 puntos (para la Tierra, es un punto por semana), eje heliocéntrico (xyz), posiciones de planetas de alta resolución VSOP2013, cálculos de la posición de la luna, un fondo de estrella con 42455 estrellas del Catálogo de entrada de Hipparcos, utiliza sensores de teléfono (brújula, giroscopio y GPS) para controlar la actitud del teléfono en 3D, y el teléfono en la escena se coloca con sensores de teléfono (GPS, giroscopio y brújula). Esta es una pequeña aplicación divertida y muestra una buena implementación de Delphi FireMonkey 3d multiplataforma.
Fri Jan 15 2021 23:31:16 GMT+0700 (Western Indonesia Time)
Planet Fun ist eine 4D-Sonnensystem-Simulation für Android und iOS und es ist in Delphi gebaut. Planetenpositionen werden mit VSOP2013 Ephemeriden berechnet, Jahre zwischen 1500 und 3000 laut dem Entwickler. Die App ist mit FireMonkey 3D-Funktionalität gebaut und der vollständige Quellcode ist verfügbar. Zu den Funktionen gehören eine Animation des Sonnensystems mit konfigurierbarer Geschwindigkeit, Auswahl des Kameraziels (Sonne oder Planeten), Einstellung von Datum/Uhrzeit zwischen den Jahren 1500 und 3000, konfigurierbare Entfernung zum Ziel, Touch-Gesten: Ein-Finger-Schwenk, Zwei-Finger-Zoom, Zwei-Finger-Drehung, Planetenbahnpunkte plus jede Bahn wird durch 52 Punkte dargestellt (für die Erde ist es ein Punkt pro Woche), heliozentrische Achsen (x und z), VSOP2013 hochauflösende Planetenpositionen, Mondpositionsberechnungen, ein Sternenhintergrund mit 42455 Sternen des Hipparcos-Eingabekatalogs, es verwendet Telefonsensoren (Kompass, Kreisel und GPS), um die 3D-Handyposition zu steuern, und das Telefon in der Szene wird mit Telefonsensoren (GPS, Kreisel und Kompass) positioniert. Dies ist eine lustige kleine App und zeigt eine schöne Implementierung von plattformübergreifendem Delphi FireMonkey 3d.
Fri Jan 15 2021 22:13:40 GMT+0700 (Western Indonesia Time)
Game Collector ist eine leistungsstarke Datenbank-Software für Videospielsammlungen und wurde in Delphi entwickelt. Laut der Website des Entwicklers ist der Hauptbildschirm von Game Collector in hohem Maße anpassbar, so dass Sie ihn so gestalten können, wie Sie es wünschen. Sie können zwischen mehreren Layouts für den Hauptbildschirm Ordner-, Listen- und Detail-Panel wählen; Listen-, Bilder- oder Kartenansicht für Ihre Spielelisten; verschiedene Vorlagen für das Spiel-Detail-Panel; und helle, dunkle und System-Skins sind für alle Bildschirme verfügbar. Sie können ganz einfach Spiele zu Ihrer Datenbank hinzufügen, nach Titel oder Barcode, und ihre zentrale Online-Spieldatenbank liefert automatisch vollständige Spieldetails wie Titel, Plattform, Beschreibung; weitere Informationen wie Genre, Entwickler, Herausgeber, Veröffentlichungsdatum usw.; und Cover Art, Back Drop Art und Trailer-Videos. Dies ist eine beeindruckende Software, die die Leistungsfähigkeit und Vielseitigkeit von Delphi unterstreicht.
Fri Jan 15 2021 22:12:58 GMT+0700 (Western Indonesia Time)
Game Collector es un potente software de base de datos de recopilación de juegos de video y está integrado en Delphi. De acuerdo con el sitio web del desarrollador, la pantalla principal de Game Collector es altamente personalizable, por lo que puede hacer que se vea como desee. Puede elegir entre varios diseños para la carpeta de la pantalla principal, la lista y los paneles de detalles; vista de lista, imágenes o tarjeta para sus listas de juegos; diferentes plantillas para el panel de detalles del juego; y las máscaras claras, oscuras y del sistema están disponibles para todas las pantallas. Puede agregar fácilmente juegos a su base de datos, por título o por código de barras, además su base de datos principal de juegos en línea proporcionará automáticamente detalles completos del juego como título, plataforma, descripción; más información como género, desarrollador, editor, fecha de lanzamiento, etc .; y carátulas, carátulas de fondo y videos de avances. Este es un software impresionante que destaca el poder y la versatilidad de Delphi.
Fri Jan 15 2021 22:11:57 GMT+0700 (Western Indonesia Time)
Game Collector é um poderoso software de banco de dados de coleção de videogames e é construído em Delphi. De acordo com o site do desenvolvedor, a tela principal do Game Collector é altamente personalizável, para que você possa deixá-la do jeito que quiser. Você pode escolher entre vários layouts para a pasta da tela principal, lista e painéis de detalhes; lista, imagens ou exibição de cartão para suas listas de jogos; diferentes modelos para o painel de detalhes do jogo; e skins claro, escuro e do sistema estão disponíveis para todas as telas. Você pode adicionar facilmente jogos ao seu banco de dados, por título ou código de barras, além de seu banco de dados de jogos online principal fornecer automaticamente detalhes completos do jogo, como título, plataforma, descrição; mais informações como gênero, desenvolvedor, editora, data de lançamento, etc .; e arte da capa, arte de fundo e vídeos de trailer. Este é um software impressionante que destaca o poder e a versatilidade do Delphi.
Fri Jan 15 2021 22:11:01 GMT+0700 (Western Indonesia Time)
Game Collector — это мощная программа для сбора данных о видеоиграх, построенная на Delphi. Согласно веб-сайту разработчика, главный экран Game Collector легко настраивается, так что вы можете сделать его так, как хотите. Вы можете выбирать между несколькими макетами для папки главного экрана, списков и панелей сведений; список, изображения или карточный просмотр для ваших списков игр; различные шаблоны для панели деталей игры; светлые, темные и системные скины доступны для всех экранов. Вы можете легко добавлять игры в свою базу данных по названию или по штрих-коду, а их основная база данных онлайн-игр автоматически предоставит полную информацию об игре, такую как название, платформа, описание; дополнительная информация, такая как жанр, разработчик, издатель, дата выпуска и т. д .; обложки, фоновые рисунки и трейлеры. Это впечатляющее программное обеспечение, подчеркивающее мощь и универсальность Delphi.
Tue Jan 12 2021 23:31:00 GMT+0700 (Western Indonesia Time)
NuSphere PhpED — это мощная собственная среда разработки Windows для PHP, построенная на Delphi. Согласно сайту разработчика, он поддерживает PHP, HTML, CSS, XML, SMARTY, XHTML и многое другое. Кроме того, они заявляют, что он имеет сбалансированное сочетание расширенного редактора кода, надежного отладчика dbg, продуктивного клиента подключения к базе данных и возможностей быстрого и безопасного развертывания, что делает PhpED полным решением для самых сложных потребностей разработчиков. PhpED действительно выглядит как мощный шаг вперед по сравнению с текстовым редактором для написания кода PHP, поскольку он предоставляет все функции, такие как встроенная отладка, профилирование и модульные тесты. Он также имеет мощную интеграцию с Firefox, Chrome и Microsoft Edge. Количество функций в PhpED поражает воображение и действительно выводит разработку PHP на новый уровень. PHP работает в огромной части Интернета, и приятно видеть, что мощные инструменты разработки программного обеспечения, подобные этому, созданы на Delphi.
Tue Jan 12 2021 23:30:41 GMT+0700 (Western Indonesia Time)
NuSphere PhpED é um poderoso IDE nativo do Windows para PHP e é construído em Delphi. De acordo com o site do desenvolvedor, ele lida com PHP, HTML, CSS, XML, SMARTY, XHTML e muito mais. Além disso, eles afirmam que possui uma combinação equilibrada de editor de código avançado, depurador dbg confiável, cliente de conectividade de banco de dados produtivo e habilidades de implantação rápida e segura tornam o PhpED uma solução completa para as necessidades de desenvolvedor mais sofisticadas. PhpED realmente parece um avanço poderoso em relação a um editor de texto para escrever código PHP com todos os recursos que fornece, como depuração integrada, criação de perfil e testes de unidade. Ele também possui integrações poderosas com Firefox, Chrome e Microsoft Edge. O número de recursos em PhpED é alucinante e realmente leva o desenvolvimento de PHP para o próximo nível. PHP executa uma grande porcentagem da web e é bom ver ferramentas poderosas de desenvolvimento de software como esta são construídas em Delphi.
Tue Jan 12 2021 23:30:07 GMT+0700 (Western Indonesia Time)
NuSphere PhpED es un potente IDE nativo de Windows para PHP y está integrado en Delphi. Según el sitio del desarrollador, maneja PHP, HTML, CSS, XML, SMARTY, XHTML y más. Además, afirman que tiene una combinación equilibrada de editor de código avanzado, depurador dbg confiable, cliente de conectividad de base de datos productiva y capacidades de implementación rápida y segura hacen de PhpED una solución completa para las necesidades de los desarrolladores más sofisticados. PhpED realmente parece un poderoso paso adelante de un editor de texto para escribir código PHP a partir de todas las características que proporciona, como depuración integrada, creación de perfiles y pruebas unitarias. También tiene poderosas integraciones con Firefox, Chrome y Microsoft Edge. La cantidad de características en PhpED es alucinante y realmente lleva el desarrollo de PHP al siguiente nivel. PHP ejecuta un gran porcentaje de la web y es bueno ver herramientas poderosas, herramientas de desarrollo de software como esta, construidas en Delphi.
Tue Jan 12 2021 23:29:44 GMT+0700 (Western Indonesia Time)
NuSphere PhpED ist eine leistungsstarke native Windows-IDE für PHP und ist in Delphi aufgebaut. Laut der Website des Entwicklers beherrscht es PHP, HTML, CSS, XML, SMARTY, XHTML und mehr. Zusätzlich geben sie an, dass es eine ausgewogene Kombination aus fortschrittlichem Code-Editor, zuverlässigem dbg-Debugger, produktivem Datenbank-Konnektivitäts-Client und schnellen und sicheren Deployment-Fähigkeiten hat, die PhpED zu einer Komplettlösung für die meisten anspruchsvollen Entwicklerbedürfnisse machen. PhpED sieht wirklich wie ein mächtiger Schritt nach oben von einem Text-Editor für das Schreiben von PHP-Code wegen all der Funktionen, die es bietet, wie in Debugging, Profiling und Unit-Tests gebaut. Es hat auch leistungsstarke Integrationen mit Firefox, Chrome und Microsoft Edge. Die Anzahl der Funktionen in PhpED ist atemberaubend und hebt die PHP-Entwicklung wirklich auf die nächste Stufe. PHP macht einen großen Teil des Webs aus und es ist schön zu sehen, dass leistungsfähige Softwareentwicklungswerkzeuge wie dieses in Delphi eingebaut sind.
{$APPTYPE CONSOLE}
{$R *.res}
uses
Classes,
SysUtils,
uSMBIOS in '....CommonuSMBIOS.pas';
procedure GetMemoryDeviceInfo;
Var
SMBios : TSMBios;
LMemoryDevice : TMemoryDeviceInformation;
begin
SMBios:=TSMBios.Create;
try
WriteLn('Memory Device Information');
WriteLn('-------------------------');
if SMBios.HasPhysicalMemoryArrayInfo then
for LMemoryDevice in SMBios.MemoryDeviceInformation do
begin
WriteLn(Format('Total Width %d bits',[LMemoryDevice.RAWMemoryDeviceInfo.TotalWidth]));
WriteLn(Format('Data Width %d bits',[LMemoryDevice.RAWMemoryDeviceInfo.DataWidth]));
WriteLn(Format('Size %d Mbytes',[LMemoryDevice.GetSize]));
WriteLn(Format('Form Factor %s',[LMemoryDevice.GetFormFactor]));
WriteLn(Format('Device Locator %s',[LMemoryDevice.GetDeviceLocatorStr]));
WriteLn(Format('Bank Locator %s',[LMemoryDevice.GetBankLocatorStr]));
WriteLn(Format('Memory Type %s',[LMemoryDevice.GetMemoryTypeStr]));
WriteLn(Format('Speed %d MHz',[LMemoryDevice.RAWMemoryDeviceInfo.Speed]));
WriteLn(Format('Manufacturer %s',[LMemoryDevice.ManufacturerStr]));
WriteLn(Format('Serial Number %s',[LMemoryDevice.SerialNumberStr]));
WriteLn(Format('Asset Tag %s',[LMemoryDevice.AssetTagStr]));
WriteLn(Format('Part Number %s',[LMemoryDevice.PartNumberStr]));
WriteLn;
if LMemoryDevice.RAWMemoryDeviceInfo.PhysicalMemoryArrayHandle>0 then
begin
WriteLn(' Physical Memory Array');
WriteLn(' ---------------------');
WriteLn(' Location '+LMemoryDevice.PhysicalMemoryArray.GetLocationStr);
WriteLn(' Use '+LMemoryDevice.PhysicalMemoryArray.GetUseStr);
WriteLn(' Error Correction '+LMemoryDevice.PhysicalMemoryArray.GetErrorCorrectionStr);
if LMemoryDevice.PhysicalMemoryArray.RAWPhysicalMemoryArrayInformation.MaximumCapacity$80000000 then
WriteLn(Format(' Maximum Capacity %d Kb',[LMemoryDevice.PhysicalMemoryArray.RAWPhysicalMemoryArrayInformation.MaximumCapacity]))
else
WriteLn(Format(' Maximum Capacity %d bytes',[LMemoryDevice.PhysicalMemoryArray.RAWPhysicalMemoryArrayInformation.ExtendedMaximumCapacity]));
WriteLn(Format(' Memory devices %d',[LMemoryDevice.PhysicalMemoryArray.RAWPhysicalMemoryArrayInformation.NumberofMemoryDevices]));
end;
WriteLn;
end
else
Writeln('No Memory Device Info was found');
finally
SMBios.Free;
end;
end;
begin
try
GetMemoryDeviceInfo;
except
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
Sat Jan 09 2021 23:35:29 GMT+0700 (Western Indonesia Time)
Делает ли вас Delphi лучшим программистом? Код Object Pascal более читабелен?
Существует алгоритм с загадочной константой , прославившийся в коде Quake III Arena C Джона Кармака для быстрого вычисления обратного квадратного корня из 32-битного числа с плавающей запятой.
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the f**k?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
Понимание Кодекса
Он основан на методе Ньютона для оценки корней. Кроме того, он преобразует число с плавающей запятой в целое, использует битовый сдвиг и начинается с приближения √2 ^ 127. Закомментированная строка позволяет провести дополнительную итерацию для улучшения оценки, которая не использовалась в Quate III Arena. Вы можете прочитать об этом больше в Википедии или посмотреть несколько видеороликов на YouTube по этой теме [включая очень глубокое погружение ]. Вот хорошее видео высокого уровня :
function rsqrt(const ANumber: Single): Single;
var
ResultAsInt: UInt32 absolute Result;
begin
Result := ANumber;
ResultAsInt := $5F3759DF - (ResultAsInt shr 1);
Result := Result * ( 1.5 - (ANumber * 0.5 * Result * Result)); // 1st iteration
// Result := Result * ( 1.5 - (ANumber * 0.5 * Result * Result)); // 2nd iteration, this can be removed
end;
Он использует ключевое слово absolute для сопоставления числа с плавающей запятой с целым числом, что позволяет избежать «злонамеренного взлома битового уровня с плавающей запятой». Это то, что мне нравится в Delphi и Object Pascal: он дает вам доступ к указателям, необработанной памяти и т.д., но не заставляет вас использовать его, когда вы не хотите / не нуждаетесь в нем. Более короткий код не всегда легче понять, просто взгляните на любое регулярное выражение, но это улучшение, потому что оно удаляет так много постороннего кода. Намного более читабельным.
Object Pascal настолько удобочитаем, что делает программистов лучше, поскольку делает их код более читаемым и поддерживаемым. Не поймите меня неправильно, вы можете писать спагетти на любом языке программирования / синтаксисе, но начать с удобочитаемого языка поможет. Вот почему существует так много «устаревших» программ Delphi: они успешны и удобны в обслуживании. Код, который не работает или не обслуживается, выбрасывается или переписывается.
Нужна более эффективная математика?
Erik van Bilsen Embarcadero MVP Co-Founder of Grijjy, inc. Author of neslib/FastMath
Если вы ищете более быстрые математические процедуры для Delphi, ознакомьтесь с высокопроизводительной библиотекой FastMath от Embarcadero MVP Эрика ван Бильсена из Grijjy.
FastMath — быстрая математическая библиотека для Delphi
FastMath — это математическая библиотека Delphi, оптимизированная для обеспечения высокой производительности (иногда за счет невыполнения проверки ошибок или небольшой потери точности).
Это делает FastMath идеальным решением для высокопроизводительных математических приложений, таких как мультимедийные приложения и игры. Для еще большей производительности библиотека предоставляет множество «приблизительных» функций (все они начинаются с Fast-префикса). Это может быть очень быстро, но вы потеряете некоторую (иногда удивительно небольшую) точность. Для игр и анимации эта потеря точности обычно вполне приемлема и компенсируется увеличением скорости. Но не используйте их для научных расчетов …
Sat Jan 09 2021 23:35:11 GMT+0700 (Western Indonesia Time)
O Delphi torna você um programador melhor? O código Object Pascal é mais legível?
Há um algoritmo com uma constante misteriosa que ganhou fama no código Quake III Arena C de John Carmack por estimar rapidamente a raiz quadrada inversa de um número de ponto flutuante de 32 bits.
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the f**k?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
Compreender o Código
É baseado no método de Newton para estimar raízes. Além disso, ele converte o número de ponto flutuante em um inteiro, usa deslocamento de bits e começa com uma aproximação de √2 ^ 127. A linha comentada permite uma iteração adicional para melhorar a estimativa, que não foi utilizada no Quate III Arena. Você pode ler mais sobre isso na Wikipedia ou assistir a alguns vídeos do YouTube sobre o assunto [incluindo um mergulho muito profundo ]. Aqui está um bom vídeo de alto nível :
A Delphi pode torná-lo melhor?
O usuário do Facebook Toon Krijthe mostrou como o código seria muito mais claro e simples se fosse implementado em Object Pascal / Delphi.
function rsqrt(const ANumber: Single): Single;
var
ResultAsInt: UInt32 absolute Result;
begin
Result := ANumber;
ResultAsInt := $5F3759DF - (ResultAsInt shr 1);
Result := Result * ( 1.5 - (ANumber * 0.5 * Result * Result)); // 1st iteration
// Result := Result * ( 1.5 - (ANumber * 0.5 * Result * Result)); // 2nd iteration, this can be removed
end;
Ele faz uso da palavra-chave absoluta para mapear o número de ponto flutuante para o inteiro, o que evita todos os “hackers de nível de bit de ponto flutuante maligno”. Isso é algo que adoro no Delphi e no Object Pascal: ele dá acesso a ponteiros, memória bruta etc., mas não o força a usá-lo quando não quiser / precisar. O código mais curto nem sempre é mais fácil de entender, basta dar uma olhada em qualquer expressão regular, mas isso é uma melhoria porque remove muitos códigos estranhos. Muito mais legível.
“Qualquer idiota pode escrever um código que um computador possa entender. Bons programadores escrevem códigos que humanos podem entender”
Martin Fowler
Software Engineer Author of “Refactoring”
O Object Pascal é tão legível que torna os programadores melhores, pois torna seu código mais legível e sustentável. Não me entenda mal, você pode escrever spaghetti em qualquer linguagem / sintaxe de programação, mas começar com uma legível ajuda. É por isso que existem tantos programas Delphi “Legados”: Eles são bem-sucedidos e podem ser mantidos. Código que não funciona ou não pode ser mantido é descartado ou reescrito.
Precisa de mais matemática de alto desempenho?
Erik van Bilsen Embarcadero MVP Co-Founder of Grijjy, inc. Author of neslib/FastMath
Se você está procurando rotinas matemáticas mais rápidas para Delphi, verifique a Biblioteca de High-Performance FastMath do Embarcadero MVP Erik van Bilsen, famoso por Grijjy.
FastMath – Biblioteca Fast Math para Delphi
FastMath é uma biblioteca matemática Delphi otimizada para desempenho rápido (às vezes ao custo de não realizar a verificação de erros ou perder um pouco de precisão).
Isso torna o FastMath ideal para aplicativos de alto desempenho com uso intensivo de matemática, como aplicativos de multimídia e jogos. Para um desempenho ainda melhor, a biblioteca oferece uma variedade de funções “aproximadas” (todas começam com um Fastprefixo). Isso pode ser muito rápido, mas você perderá alguma precisão (às vezes surpreendentemente pequena). Para jogos e animação, essa perda de precisão é geralmente perfeitamente aceitável e compensada pelo aumento na velocidade. Não os use para cálculos científicos …
Sat Jan 09 2021 23:34:47 GMT+0700 (Western Indonesia Time)
¿Delphi te convierte en un mejor programador? ¿El código Object Pascal es más legible?
Hay un algoritmo con una constante misteriosa que saltó a la fama en el código Quake III Arena C de John Carmack para estimar rápidamente la raíz cuadrada inversa de un número de coma flotante de 32 bits.
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the f**k?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
Entendiendo el Código
Se basa en el método de Newton para estimar raíces. Además, convierte el número de punto flotante en un entero, usa el desplazamiento de bits y comienza con una aproximación de √2 ^ 127. La línea comentada permite una iteración adicional para mejorar la estimación, que no se usó en Quate III Arena. Puede leer más sobre esto en Wikipedia o ver algunos videos de YouTube sobre el tema [incluido un análisis muy profundo ]. Aquí hay un buen video de alto nivel :
function rsqrt(const ANumber: Single): Single;
var
ResultAsInt: UInt32 absolute Result;
begin
Result := ANumber;
ResultAsInt := $5F3759DF - (ResultAsInt shr 1);
Result := Result * ( 1.5 - (ANumber * 0.5 * Result * Result)); // 1st iteration
// Result := Result * ( 1.5 - (ANumber * 0.5 * Result * Result)); // 2nd iteration, this can be removed
end;
Hace uso de la palabra clave absoluta para asignar el número de punto flotante al entero, lo que evita todo el “hackeo maligno de nivel de bits de punto flotante”. Esto es algo que me encanta de Delphi y Object Pascal: te da acceso a punteros, memoria bruta, etc. pero no te obliga a usarlo cuando no quieres o necesitas. El código más corto no siempre es más fácil de entender, solo eche un vistazo a cualquier expresión regular, pero esto es una mejora porque elimina mucho código extraño. Mucho más legible.
“Cualquier tonto puede escribir un código que una computadora pueda entender. Los buenos programadores escriben código que los humanos pueden entender “.
Martin Fowler
Software Engineer Author of “Refactoring”
Object Pascal es tan legible que mejora a los programadores ya que hace que su código sea más legible y fácil de mantener. No me malinterpretes, puedes escribir espaguetis en cualquier lenguaje / sintaxis de programación, pero comenzar con uno legible ayuda. Ésta es la razón por la que existen tantos programas Delphi “heredados”: son exitosos y se pueden mantener. El código que no funciona o que no se puede mantener se descarta o se reescribe.
¿Necesita más matemáticas de alto rendimiento?
Erik van Bilsen Embarcadero MVP Co-Founder of Grijjy, inc. Author of neslib/FastMath
Si está buscando rutinas matemáticas más rápidas para Delphi, consulte la biblioteca FastMath de alto rendimiento del MVP de Embarcadero Erik van Bilsen de Grijjy.
FastMath: biblioteca matemática rápida para Delphi
FastMath es una biblioteca matemática de Delphi que está optimizada para un rendimiento rápido (a veces a costa de no realizar la verificación de errores o perder un poco de precisión).
Esto hace que FastMath sea ideal para aplicaciones de alto rendimiento con uso intensivo de matemáticas, como aplicaciones y juegos multimedia. Para un rendimiento aún mejor, la biblioteca proporciona una variedad de funciones “aproximadas” (todas comienzan con un Fastprefijo). Pueden ser muy rápidos, pero perderá algo de precisión (a veces sorprendentemente poca). Para los juegos y la animación, esta pérdida de precisión suele ser perfectamente aceptable y se ve compensada por el aumento de la velocidad. Sin embargo, no los use para cálculos científicos …
Sat Jan 09 2021 23:34:34 GMT+0700 (Western Indonesia Time)
Macht Delphi Sie zu einem besseren Programmierer? Ist Object Pascal-Code besser lesbar?
Es gibt einen Algorithmus mit einer Mystery-Konstante , der in John Carmacks Quake III Arena C-Code berühmt wurde, um die inverse Quadratwurzel einer 32-Bit-Gleitkommazahl schnell abzuschätzen.
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the f**k?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
Den Code verstehen
Es basiert auf Newtons Methode zur Schätzung von Wurzeln. Außerdem konvertiert es die Gleitkommazahl in eine Ganzzahl, verwendet die Bitverschiebung und beginnt mit einer Näherung von √2 ^ 127. Die auskommentierte Zeile ermöglicht eine zusätzliche Iteration zur Verbesserung der Schätzung, die in der Quate III Arena nicht verwendet wurde. Sie können mehr darüber in Wikipedia lesen oder sich einige YouTube-Videos zum Thema ansehen [einschließlich eines sehr tiefen Tauchgangs ]. Hier ist ein schönes High-Level-Video :
Kann Delphi es besser machen?
Der Facebook-Nutzer Toon Krijthe zeigte, wie viel klarer und einfacher der Code wäre, wenn er in Object Pascal / Delphi implementiert würde.
function rsqrt(const ANumber: Single): Single;
var
ResultAsInt: UInt32 absolute Result;
begin
Result := ANumber;
ResultAsInt := $5F3759DF - (ResultAsInt shr 1);
Result := Result * ( 1.5 - (ANumber * 0.5 * Result * Result)); // 1st iteration
// Result := Result * ( 1.5 - (ANumber * 0.5 * Result * Result)); // 2nd iteration, this can be removed
end;
Es verwendet das absolute Schlüsselwort, um die Gleitkommazahl der Ganzzahl zuzuordnen, wodurch alle „bösen Gleitkomma-Bit-Level-Hacking“ vermieden werden . Dies ist etwas, das ich an Delphi und Object Pascal liebe: Es gibt Ihnen Zugriff auf Zeiger, Rohspeicher usw., zwingt Sie jedoch nicht dazu, es zu verwenden, wenn Sie es nicht wollen / müssen. Kürzerer Code ist nicht immer einfacher zu verstehen. Sehen Sie sich nur einen regulären Ausdruck an. Dies ist jedoch eine Verbesserung, da so viel überflüssiger Code entfernt wird. Viel besser lesbar.
„Jeder Dummkopf kann Code schreiben, den ein Computer verstehen kann. Gute Programmierer schreiben Code, den Menschen verstehen können. “
Martin Fowler
Software Engineer Author of „Refactoring“
Object Pascal ist so lesbar, dass Programmierer besser werden, da ihr Code besser lesbar und wartbar ist. Versteh mich nicht falsch, du kannst Spaghetti in jeder Programmiersprache / Syntax schreiben, aber es hilft, mit einer lesbaren zu beginnen. Aus diesem Grund gibt es so viele „Legacy“ -Delphi-Programme: Sie sind erfolgreich und wartbar. Code, der nicht funktioniert oder nicht gewartet werden kann, wird verworfen oder neu geschrieben.
Benötigen Sie mehr Hochleistungsmathematik?
Erik van Bilsen Embarcadero MVP Co-Founder of Grijjy, inc. Author of neslib/FastMath
Wenn Sie nach schnelleren mathematischen Routinen für Delphi suchen, besuchen Sie die Hochleistungs-FastMath-Bibliothek von Embarcadero MVP Erik van Bilsen von Grijjy.
FastMath – Schnelle Mathematikbibliothek für Delphi
FastMath ist eine Delphi-Mathematikbibliothek, die für eine schnelle Leistung optimiert ist (manchmal auf Kosten einer fehlenden Fehlerprüfung oder eines geringen Genauigkeitsverlusts).
Dies macht FastMath ideal für leistungsstarke mathematikintensive Anwendungen wie Multimedia-Anwendungen und Spiele. Für eine noch bessere Leistung bietet die Bibliothek eine Vielzahl von „ungefähren“ Funktionen (die alle mit einem FastPräfix beginnen). Diese können sehr schnell sein, aber Sie verlieren etwas (manchmal überraschend wenig) Genauigkeit. Bei Spielen und Animationen ist dieser Genauigkeitsverlust normalerweise durchaus akzeptabel und wird durch die Geschwindigkeitssteigerung aufgewogen. Verwenden Sie sie jedoch nicht für wissenschaftliche Berechnungen…
Fri Jan 08 2021 23:29:31 GMT+0700 (Western Indonesia Time)
Movie Collector — это программа базы данных фильмов для каталогизации вашей коллекции DVD / Blu-ray, построенная на Delphi. Он является частью набора программных продуктов Collectorz.com для настольных ПК для каталогизации ваших фильмов, книг, музыки, комиксов и игр. В соответствии с их функциями сайта: просмотр, сортировка и поиск в вашей коллекции фильмов в различных макетах и представлениях, легкое добавление DVD и Blu-ray в вашу базу данных, по названию или штрих-коду, организация файлов фильмов путем сканирования папок, бесплатное облако CLZ хранилище для резервных копий, синхронизации и обмена и многого другого. У них есть как версия для Windows, так и версия для Mac для настольных компьютеров. Он предлагает как светлую, так и темную тему, а также такие опции, как синхронизация с облаком и поиск через IMDb. Впечатляет!
Fri Jan 08 2021 23:29:11 GMT+0700 (Western Indonesia Time)
Movie Collector é um software de banco de dados de filmes para catalogar sua coleção de DVD / Blu-ray e é construído em Delphi. Faz parte do conjunto Collectorz.com de produtos de software de desktop para catalogar seus filmes, livros, música, quadrinhos e jogos. De acordo com o site, os recursos incluem: Navegar, classificar e pesquisar sua coleção de filmes em vários layouts e visualizações, Adicionar DVDs e Blu-Rays facilmente ao seu banco de dados, por título ou código de barras, organizar seus arquivos de filme digitalizando suas pastas, Free CLZ Cloud armazenamento para backups, sincronização e compartilhamento e muito mais. Eles apresentam uma versão do Windows e uma versão do Mac para a área de trabalho. Ele oferece um tema claro e um tema escuro, além de opções como sincronizar com a nuvem e pesquisar via IMDb. Impressionante!
Fri Jan 08 2021 23:23:24 GMT+0700 (Western Indonesia Time)
Movie Collector es un software de base de datos de películas para catalogar su colección de DVD / Blu-ray y está integrado en Delphi. Es parte del conjunto de productos de software de escritorio de Collectorz.com para catalogar sus películas, libros, música, cómics y juegos. De acuerdo con las características de su sitio, se incluyen: Navegue, clasifique y busque su colección de películas en varios diseños y vistas, agregue fácilmente DVD y Blu-Ray a su base de datos, por título o código de barras, organice sus archivos de películas escaneando sus carpetas, CLZ Cloud gratuito almacenamiento para copias de seguridad, sincronización y uso compartido, y más. Cuentan con una versión de Windows y una versión de Mac para el escritorio. Ofrece un tema claro y un tema oscuro, además de opciones como la sincronización con la nube y la búsqueda a través de IMDb. ¡Impresionante!
Fri Jan 08 2021 23:23:01 GMT+0700 (Western Indonesia Time)
Movie Collector ist eine Filmdatenbank-Software zum Katalogisieren Ihrer DVD-/Blu-ray-Sammlung und ist in Delphi erstellt. Es ist Teil der Collectorz.com-Suite von Desktop-Softwareprodukten zum Katalogisieren Ihrer Filme, Bücher, Musik, Comics und Spiele. Laut ihrer Website gehören zu den Funktionen: Durchsuchen, Sortieren und Durchsuchen Ihrer Filmsammlung in verschiedenen Layouts und Ansichten, einfaches Hinzufügen von DVDs und Blu-Rays zu Ihrer Datenbank, nach Titel oder nach Barcode, Organisieren Ihrer Filmdateien durch Scannen Ihrer Ordner, kostenloser CLZ-Cloud-Speicher für Backups, Synchronisierung und Freigabe und mehr. Sie bieten sowohl eine Windows-Version als auch eine Mac-Version für den Desktop. Es bietet sowohl ein helles als auch ein dunkles Thema sowie Optionen wie die Synchronisierung mit der Cloud und die Suche über IMDb. Beeindruckend!
Fri Jan 08 2021 23:22:47 GMT+0700 (Western Indonesia Time)
TreeSize — это мощный менеджер файлового и дискового пространства, встроенный в Delphi. Согласно сайту разработчика «Программное обеспечение анализирует все сохраненные данные в ваших системах и визуализирует результаты в виде значимых диаграмм и статистических данных. Вы можете сразу узнать, куда ушло ваше дисковое пространство, и при необходимости предпринять немедленные действия. с широким набором опций управления файлами «. Кроме того, они заявляют: «Всемирно известное решение оптимизировано для работы с большими объемами файлов и дополняет Windows Explorer. Высокая степень автоматизации обеспечивается параметрами командной строки и управлением планированием сканирования непосредственно в удобном графическом пользовательском интерфейсе». И существует он с 1997 года (то есть более 20 лет!). Это мощное решение, которое отлично подходит для определения места на вашем жестком диске (особенно на серверах).
Fri Jan 08 2021 23:22:32 GMT+0700 (Western Indonesia Time)
TreeSize é um poderoso gerenciador de arquivos e espaço em disco e é construído em Delphi. De acordo com o site do desenvolvedor “O software analisa todos os dados armazenados em seus sistemas e visualiza os resultados em gráficos e estatísticas significativos. Descubra onde o espaço do seu disco foi colocado em um piscar de olhos e tome medidas imediatas, se necessário. Para este propósito, TreeSize fornece com uma ampla gama de opções de gerenciamento de arquivos. ” Além disso, eles dizem “A solução mundialmente conhecida é otimizada para lidar com grandes volumes de arquivos e complementa o Windows Explorer. Um alto grau de automação é habilitado por parâmetros de linha de comando e gerenciamento de agendamento de varreduras diretamente em uma interface gráfica de usuário confortável.” E existe desde 1997 (portanto, mais de 20 anos!). Esta é uma solução poderosa que funciona muito bem para descobrir para onde foi todo o espaço do seu disco rígido (especialmente em servidores).
Fri Jan 08 2021 23:21:21 GMT+0700 (Western Indonesia Time)
TreeSize es un poderoso administrador de archivos y espacio en disco y está integrado en Delphi. Según el sitio del desarrollador, “El software analiza todos los datos almacenados en sus sistemas y visualiza los resultados en gráficos y estadísticas significativas. Descubra dónde se ha ido el espacio en el disco de un vistazo y tome medidas inmediatas si es necesario. Para este propósito, TreeSize le brinda con una amplia gama de opciones de administración de archivos “. Además, dicen: “La solución de renombre mundial está optimizada para manejar grandes volúmenes de archivos y complementa el Explorador de Windows. Se permite un alto grado de automatización mediante los parámetros de la línea de comandos y la gestión de la programación de análisis directamente en una cómoda interfaz gráfica de usuario“. Y existe desde 1997 (¡más de 20 años!). Esta es una solución poderosa que funciona muy bien para encontrar dónde fue todo el espacio de su disco duro (especialmente en los servidores).
Fri Jan 08 2021 23:20:57 GMT+0700 (Western Indonesia Time)
TreeSize ist ein leistungsfähiger Datei- und Speicherplatzmanager und wurde in Delphi entwickelt. Laut der Website des Entwicklers „analysiert die Software alle gespeicherten Daten über Ihre Systeme hinweg und visualisiert die Ergebnisse in aussagekräftigen Diagrammen und Statistiken. Finden Sie auf einen Blick heraus, wo Ihr Festplattenplatz geblieben ist und ergreifen Sie bei Bedarf sofort Maßnahmen. Zu diesem Zweck bietet TreeSize Ihnen eine breite Palette an Dateiverwaltungsoptionen.“ Weiter heißt es: „Die weltbekannte Lösung ist für den Umgang mit großen Dateimengen optimiert und ergänzt den Windows Explorer. Ein hoher Automatisierungsgrad wird durch Kommandozeilenparameter und die Verwaltung der Scan-Planung direkt in einer komfortablen, grafischen Benutzeroberfläche ermöglicht.“ Und es gibt sie seit 1997 (also seit über 20 Jahren!). Dies ist eine leistungsstarke Lösung, die sich hervorragend eignet, um herauszufinden, wo der ganze Festplattenplatz geblieben ist (besonders auf Servern).
Fri Jan 08 2021 01:00:00 GMT+0700 (Western Indonesia Time)
Baxel Data社のCue Player Oneは、1つのキューリスト、1台のコンピューター、1人のオペレーターで、サウンド、ビデオ、ライト、アクセサリを制御できる劇場向けプログラムであり、 Delphiによって構築されています。 劇場用のプロ仕様のソフトウェアであるCue Playerファミリーには、Cue Player PremiumとCue Player Lightingが含まれています。Baxel Data社によれば、そのソフトウェアは世界中の1000以上の劇場、教会、学校で使用されています。
Baxel Data社によれば「演出のためにラップトップやノートPCを会場に持込みたい地元やコミュニティの劇場がもっと数多くある」とのこと。Cue Player Oneは、このような需要から生まれました。主力製品のソフトウェアから、サウンド機能と照明機能を1つのプログラムと1つのキューリストにまとめたのが、Cue Player Oneです。Cue Player Oneは、DMXインターフェイスなど劇場のハードウェアユニットと緊密に統合でき、照明やMIDIサーフェイスを制御できます。
このアプリをデバイスへインストールした後、RAD Studio IDEメニューの[表示]-[デバイスにブロードキャスト] を有効にしてください。そしてデバイスのアプリを起動し、アプリからリストされた PC 上の IDE に接続する必要があります。 (これには、IDE を実行している PC または VM とデバイスが同じ内部ネットワーク上にある必要があることに注意してください)
Wed Jan 06 2021 23:34:17 GMT+0700 (Western Indonesia Time)
GetIt Package Manager — это менеджер пакетов, встроенный в RAD Studio IDE, который позволяет вам просматривать, загружать, покупать и устанавливать пакеты. Пакеты могут содержать библиотеки, компоненты, расширения IDE и SDK. Пакеты, доступные в диспетчере пакетов, можно просмотреть на сайте Embarcadero GetIt и загрузить в среде IDE или через командную строку. Кроме того, последний список новых пакетов, добавленных в диспетчер пакетов GetIt, доступен через RSS-канал .
Цель GetIt — помочь клиентам найти ценные библиотеки и легко установить их в среде IDE, а также упростить миграцию с одной версии RAD Studio на другую, обеспечивая доступность этих библиотек после выпуска, чтобы существующий проект мог быть легко перенесенным после быстрой загрузки необходимых библиотек.
Вы можете установить пакеты из GetIt через командную строку: GetItCmd
GetIt Package Manager - Version 7.0
Copyright c 2019 Embarcadero Technologies, Inc. All Rights Reserved.
Usage: GetItCmd []:
-install or -i
Install Item[s] separated with ';'
-uninstall or -u
Uninstall Item[s] separated with ';'
-user_name:
User name for proxies with required authentication.
-password:
Password for proxies with required authentication.
-accept_eulas
The user accepts EULA[s] of downloaded package[s].
-verb:[Quiet/Minimal/Normal/Detailed]
Specifies the verbose level for console output messages.
-listavailable:[Filter by substring]
List all avilable packages from package source.
Options:
-filter:[All/Free/Acquired/Installed]. Default[Installed].
-sort:[Name/Vendor]. Default[Name].
-r Custom registry subkey for saving.
В декабре 2020 года в Embarcadero GetIt был добавлен ряд новых или обновленных библиотек. Взгляните!
Вкладки TChrome — это комплексная реализация системы вкладок Google Chrome — функции включают — полностью анимированные вкладки, перетаскивание, автоматическое изменение размера и позиционирования, текст справа налево, настраиваемые формы вкладок, полную демонстрацию и многое другое.
29 декабря 2020 г. Общественная лицензия Mozilla 1.1 (MPL 1.1)
ICS — это библиотека Delphi, состоящая из множества интернет-компонентов, поддерживающих все основные протоколы и приложения. Все компоненты управляются событиями и не блокируются, с блокирующими версиями для более простых приложений. Включает OpenSSL 1.1.1i.
23 дек.2020 г. Бесплатное ПО, защищенное авторским правом
ICS — это библиотека Delphi, состоящая из множества интернет-компонентов, поддерживающих все основные протоколы и приложения. Все компоненты управляются событиями и не блокируются, с блокирующими версиями для более простых приложений. Включает OpenSSL 1.1.1i.
23 дек.2020 г. Бесплатное ПО, защищенное авторским правом
SynEdit для Delphi и CBuilder. Элемент управления редактирования выделения синтаксиса, не основанный на общих элементах управления Windows. Поддерживается на платформах: Windows.
Электронные книги EWriter — это современная альтернатива устаревшему формату CHM для справки по локальным приложениям. Они предлагают полную поддержку контекстно-зависимой справки и ссылок на файлы. Они сочетают в себе преимущества CHM и WebHelp и устраняют недостатки обоих. Пакет включает модуль Vcl.EwriterHelpViewer.pas, который реализует поддержку формата справки eWriter в справочной системе Delphi. Приложения, которые в настоящее время используют файлы CHM для справки, могут переключиться на справку eWriter почти без изменений.
21 декабря 2020 г. Стандартная общественная лицензия GNU (GPL)
Библиотека криптографии, содержащая хэш-алгоритмы, криптографический генератор псевдослучайных чисел и классы преобразования CRC и формата, а также демонстрационные проекты и обширную документацию.
Современные приложения имеют несколько потоков, и этот плагин позволяет выполнять отладку параллельно: так же, как работает ваш код! Просматривайте несколько стеков вызовов, шагайте или запускайте каждый поток вместо всего процесса, смотрите выполнение нескольких потоков прямо в редакторе кода — и многое другое.
Эксперт RAD Studio для создания установщиков NSIS и Inno Setup из среды IDE. Он интегрирует NSIS (Nullsoft Scriptable Install System) и Inno Setup с IDE и позволяет вам создавать и строить проекты NSIS и Inno Setup (установщики) прямо в RAD Studio, получая все преимущества общей интегрированной среды!
Генератор отчетов FastReport FMX — это современное решение для интеграции Business Intelligence в ваше программное обеспечение. Он создан для разработчиков, которые хотят использовать готовые компоненты для отчетности. FastReport FMX, благодаря простоте использования, удобству и небольшому размеру дистрибутива, способен обеспечить высокую функциональность и производительность практически на любом современном ПК.
AQtime — это интегрированный набор инструментов профилировщика, который помогает находить узкие места в производительности, а также утечки памяти и ресурсов в ваших приложениях и легко устранять их. С помощью AQtime Standard для Embarcadero RAD Studio вы можете профилировать 32-разрядные приложения с собственным кодом, созданные с помощью Embarcadero RAD Studio XE6 — XE8, 10, 10.1.
RVMedia — это набор компонентов для отображения видео из различных источников, управления IP-камерами, организации видеочатов, записи аудио и видео файлов.
RVMedia — это набор компонентов для отображения видео из различных источников, управления IP-камерами, организации видеочатов, записи аудио и видео файлов (платформа Windows).
Wed Jan 06 2021 23:33:46 GMT+0700 (Western Indonesia Time)
O GetIt Package Manager é o gerenciador de pacotes integrado ao RAD Studio IDE que permite navegar, fazer download, comprar e instalar pacotes. Os pacotes podem fornecer bibliotecas, componentes, extensões IDE e SDKs. Os pacotes disponíveis no gerenciador de pacotes podem ser navegados no site Embarcadero GetIt e baixados no IDE ou via linha de comando. Além disso, a lista mais recente de novos pacotes adicionados ao Gerenciador de Pacotes GetIt está disponível via RSS feed .
O objetivo do GetIt é ajudar os clientes a descobrir bibliotecas valiosas e instalá-las facilmente no IDE, além de ajudar a simplificar a migração de uma versão do RAD Studio para a próxima, garantindo que essas bibliotecas estejam disponíveis na liberação para que um projeto existente possa ser facilmente migrado após um download rápido das bibliotecas necessárias.
Você pode instalar pacotes do GetIt por meio da linha de comando: GetItCmd
GetIt Package Manager - Version 7.0
Copyright c 2019 Embarcadero Technologies, Inc. All Rights Reserved.
Usage: GetItCmd []:
-install or -i
Install Item[s] separated with ';'
-uninstall or -u
Uninstall Item[s] separated with ';'
-user_name:
User name for proxies with required authentication.
-password:
Password for proxies with required authentication.
-accept_eulas
The user accepts EULA[s] of downloaded package[s].
-verb:[Quiet/Minimal/Normal/Detailed]
Specifies the verbose level for console output messages.
-listavailable:[Filter by substring]
List all avilable packages from package source.
Options:
-filter:[All/Free/Acquired/Installed]. Default[Installed].
-sort:[Name/Vendor]. Default[Name].
-r Custom registry subkey for saving.
Uma série de bibliotecas novas ou atualizadas foram adicionadas ao Embarcadero GetIt em dezembro de 2020. Dê uma olhada!
TChrome tabs é uma implementação abrangente do sistema de guias do Google Chrome – os recursos incluem – guias totalmente animadas, arrastar e soltar, redimensionamento e posicionamento automáticos, texto da direita para a esquerda, formatos de guia personalizados, demonstração completa e muito mais.
29 de dezembro de 2020 Mozilla Public License 1.1 (MPL 1.1)
ICS é uma biblioteca Delphi composta de muitos componentes da Internet que suportam todos os principais protocolos e aplicativos. Todos os componentes são orientados por eventos e não bloqueiam, com versões bloqueadoras para aplicativos mais simples. Inclui OpenSSL 1.1.1i.
23 de dezembro de 2020 freeware com direitos autorais
ICS é uma biblioteca Delphi composta de muitos componentes da Internet que suportam todos os principais protocolos e aplicativos. Todos os componentes são orientados por eventos e não bloqueiam, com versões bloqueadoras para aplicativos mais simples. Inclui OpenSSL 1.1.1i.
23 de dezembro de 2020 freeware com direitos autorais
SynEdit para Delphi e CBuilder. Controle de edição de realce de sintaxe, não baseado nos controles comuns do Windows. Suportado em plataformas: Windows.
EWriter eBooks são a alternativa moderna para o formato CHM obsoleto para ajuda de aplicativo local. Eles oferecem suporte completo para ajuda sensível ao contexto e links de arquivos. Eles combinam os benefícios do CHM e do WebHelp e eliminam as desvantagens de ambos. O pacote inclui a unidade Vcl.EwriterHelpViewer.pas que implementa suporte para o formato de ajuda eWriter no sistema de ajuda do Delphi. Os aplicativos que atualmente usam arquivos CHM para obter ajuda do aplicativo podem mudar para a ajuda do eWriter quase sem alterações.
21 de dezembro de 2020 GNU General Public License (GPL)
Biblioteca de criptografia contendo algoritmos de hash, um gerador de números pseudo-aleatórios criptográficos e CRC e classes de conversão de formato, juntamente com projetos de demonstração e extensa documentação.
Os aplicativos modernos têm vários threads e este plugin permite que você depure em paralelo: da mesma forma que seu código é executado! Veja várias pilhas de chamadas, avance ou execute cada thread em vez de todo o processo, veja a execução de várias threads diretamente no editor de código – e muito mais.
Especialista do RAD Studio para criar instaladores NSIS e Inno Setup a partir do IDE. Ele integra NSIS (Nullsoft Scriptable Install System) e Inno Setup com o IDE e permite que você crie e construa projetos NSIS e Inno Setup (instaladores) diretamente no RAD Studio, obtendo todos os benefícios do ambiente integrado comum!
Gerador de relatórios FastReport FMX é uma solução moderna para integração de Business Intelligence em seu software. Ele foi criado para desenvolvedores que desejam usar componentes prontos para relatórios. O FastReport FMX, com sua simplicidade de uso, conveniência e pequeno tamanho de distribuição, é capaz de fornecer alta funcionalidade e desempenho em quase todos os PCs modernos.
AQtime é um kit de ferramentas de criação de perfil integrado que ajuda a encontrar gargalos de desempenho e vazamentos de memória e recursos em seus aplicativos e eliminá-los facilmente. Com o AQtime Standard para Embarcadero RAD Studio, você pode criar perfis de aplicativos de código nativo de 32 bits criados com Embarcadero RAD Studio XE6 – XE8, 10, 10.1.
RVMedia é um conjunto de componentes para exibição de vídeo de várias fontes, controle de câmeras IP, organização de chats de vídeo, gravação de arquivos de áudio e vídeo.
RVMedia é um conjunto de componentes para exibição de vídeo de várias fontes, controle de câmeras IP, organização de chats de vídeo, gravação de arquivos de áudio e vídeo (plataforma Windows).
Wed Jan 06 2021 23:33:23 GMT+0700 (Western Indonesia Time)
GetIt Package Manager es el administrador de paquetes integrado en RAD Studio IDE que le permite navegar, descargar, comprar e instalar paquetes. Los paquetes pueden proporcionar bibliotecas, componentes, extensiones IDE y SDK. Los paquetes disponibles en el administrador de paquetes se pueden navegar en el sitio de Embarcadero GetIt y descargar en el IDE o mediante una línea de comando. Además, la lista más reciente de paquetes nuevos agregados al Administrador de paquetes GetIt está disponible a través de RSS .
El objetivo de GetIt es ayudar a los clientes a descubrir bibliotecas valiosas e instalarlas fácilmente en el IDE, además está destinado a ayudar a simplificar la migración de una versión de RAD Studio a la siguiente, asegurándose de que esas bibliotecas estén disponibles en el momento del lanzamiento para que un proyecto existente pueda ser migrado fácilmente después de una descarga rápida de las bibliotecas requeridas.
Puede instalar paquetes desde GetIt a través de la línea de comando: GetItCmd
GetIt Package Manager - Version 7.0
Copyright c 2019 Embarcadero Technologies, Inc. All Rights Reserved.
Usage: GetItCmd []:
-install or -i
Install Item[s] separated with ';'
-uninstall or -u
Uninstall Item[s] separated with ';'
-user_name:
User name for proxies with required authentication.
-password:
Password for proxies with required authentication.
-accept_eulas
The user accepts EULA[s] of downloaded package[s].
-verb:[Quiet/Minimal/Normal/Detailed]
Specifies the verbose level for console output messages.
-listavailable:[Filter by substring]
List all avilable packages from package source.
Options:
-filter:[All/Free/Acquired/Installed]. Default[Installed].
-sort:[Name/Vendor]. Default[Name].
-r Custom registry subkey for saving.
Se agregaron varias bibliotecas nuevas o actualizadas a Embarcadero GetIt en diciembre de 2020. ¡Eche un vistazo!
TChrome tabs es una implementación completa del sistema de pestañas de Google Chrome; las características incluyen pestañas totalmente animadas, arrastrar y soltar, cambio de tamaño y posicionamiento automático, texto de derecha a izquierda, formas de pestañas personalizadas, demostración completa y mucho más.
29 de diciembre de 2020 Licencia pública de Mozilla 1.1 (MPL 1.1)
ICS es una biblioteca de Delphi compuesta por muchos componentes de Internet que admiten todos los protocolos y aplicaciones principales. Todos los componentes son controlados por eventos y sin bloqueo, con versiones de bloqueo para aplicaciones más simples. Incluye OpenSSL 1.1.1i.
23 de diciembre de 2020 Freeware con derechos de autor
ICS es una biblioteca de Delphi compuesta por muchos componentes de Internet que admiten todos los protocolos y aplicaciones principales. Todos los componentes son controlados por eventos y sin bloqueo, con versiones de bloqueo para aplicaciones más simples. Incluye OpenSSL 1.1.1i.
23 de diciembre de 2020 Freeware con derechos de autor
SynEdit para Delphi y CBuilder. Control de edición de resaltado de sintaxis, no basado en los controles comunes de Windows. Compatible con plataformas: Windows.
Los libros electrónicos EWriter son la alternativa moderna al formato CHM obsoleto para la ayuda de aplicaciones locales. Ofrecen soporte completo para ayuda contextual y enlaces a archivos. Combinan los beneficios de CHM y WebHelp y eliminan las desventajas de ambos. El paquete incluye la unidad Vcl.EwriterHelpViewer.pas que implementa el soporte para el formato de ayuda de eWriter en el sistema de ayuda de Delphi. Las aplicaciones que actualmente usan archivos CHM para ayuda de aplicaciones pueden cambiar a la ayuda de eWriter casi sin cambios.
21 de diciembre de 2020 Licencia pública general GNU (GPL)
EWriter eBooks are the modern alternative to the obsolete CHM format for local application help. They offer full support for context-sensitive help and file links. They combine the benefits of CHM and WebHelp and eliminate the disadvantages of both. The package includes the unit Vcl.EwriterHelpViewer.pas which implements support for the eWriter help format in Delphi’s help system. Applications currently using CHM files for application help can switch to eWriter help almost without changes.
Biblioteca de criptografía que contiene algoritmos hash, un generador criptográfico de números pseudoaleatorios y clases de conversión de formato y CRC junto con proyectos de demostración y una amplia documentación.
Las aplicaciones modernas tienen varios subprocesos, y este complemento le permite depurar en paralelo: ¡de la misma manera que se ejecuta su código! Vea múltiples pilas de llamadas, recorra o ejecute cada hilo en lugar de todo el proceso, vea la ejecución de varios hilos directamente en el editor de código, y más.
Experto en RAD Studio para crear instaladores de NSIS e Inno Setup desde el IDE. ¡Integra NSIS (Nullsoft Scriptable Install System) e Inno Setup con el IDE y le permite crear y construir proyectos NSIS e Inno Setup (instaladores) directamente dentro de RAD Studio obteniendo todos los beneficios del entorno integrado común!
Generador de informes FastReport FMX es una solución moderna para integrar Business Intelligence en su software. Ha sido creado para desarrolladores que desean utilizar componentes listos para usar para generar informes. FastReport FMX, con su simplicidad de uso, conveniencia y pequeño tamaño de distribución, es capaz de proporcionar alta funcionalidad y rendimiento en casi cualquier PC moderna.
AQtime es un kit de herramientas de perfilado integrado que le ayuda a encontrar cuellos de botella en el rendimiento y fugas de memoria y recursos en sus aplicaciones y eliminarlos fácilmente. Con AQtime Standard para Embarcadero RAD Studio, puede perfilar aplicaciones de código nativo de 32 bits creadas con Embarcadero RAD Studio XE6 – XE8, 10, 10.1.
RVMedia es un conjunto de componentes para mostrar video de varias fuentes, controlar cámaras IP, organizar chats de video, grabar archivos de audio y video.
RVMedia es un conjunto de componentes para mostrar video de varias fuentes, controlar cámaras IP, organizar chats de video, grabar archivos de audio y video (plataforma Windows).
Abbrevia es un kit de herramientas de compresión para Delphi, C ++ Builder, Kylix y Free Pascal. Compatible con plataformas: Windows, Android, OS X, iOS.
1 de diciembre de 2020 LICENCIA PÚBLICA DE MOZILLA
Abbrevia es un kit de herramientas de compresión para Delphi, C ++ Builder, Kylix y Free Pascal. Compatible con plataformas: Windows, Android, OS X, iOS.
1 de diciembre de 2020 LICENCIA PÚBLICA DE MOZILLA
Wed Jan 06 2021 23:33:02 GMT+0700 (Western Indonesia Time)
Der GetIt-Paketmanager ist der in die RAD Studio-IDE integrierte Paketmanager, mit dem Sie Pakete durchsuchen, herunterladen, kaufen und installieren können. Pakete können Bibliotheken, Komponenten, IDE-Erweiterungen und SDKs bereitstellen. Im Paketmanager verfügbare Pakete können auf der Embarcadero GetIt- Site durchsucht und in der IDE oder über eine Befehlszeile heruntergeladen werden. Darüber hinaus ist die neueste Liste der neuen Pakete, die dem GetIt Package Manager hinzugefügt wurden, per RSS-Feed verfügbar .
Das Ziel von GetIt ist es, Kunden dabei zu helfen, wertvolle Bibliotheken zu entdecken und sie einfach in der IDE zu installieren. Außerdem soll es die Migration von einer Version von RAD Studio zur nächsten vereinfachen und sicherstellen, dass diese Bibliotheken bei der Veröffentlichung verfügbar sind, damit ein vorhandenes Projekt dies kann leicht nach einem schnellen Download der erforderlichen Bibliotheken migriert werden.
Sie können Pakete von GetIt über die folgende Befehlszeile installieren: GetItCmd
GetIt Package Manager - Version 7.0
Copyright c 2019 Embarcadero Technologies, Inc. All Rights Reserved.
Usage: GetItCmd []:
-install or -i
Install Item[s] separated with ';'
-uninstall or -u
Uninstall Item[s] separated with ';'
-user_name:
User name for proxies with required authentication.
-password:
Password for proxies with required authentication.
-accept_eulas
The user accepts EULA[s] of downloaded package[s].
-verb:[Quiet/Minimal/Normal/Detailed]
Specifies the verbose level for console output messages.
-listavailable:[Filter by substring]
List all avilable packages from package source.
Options:
-filter:[All/Free/Acquired/Installed]. Default[Installed].
-sort:[Name/Vendor]. Default[Name].
-r Custom registry subkey for saving.
Im Dezember 2020 wurde Embarcadero GetIt eine Reihe neuer oder aktualisierter Bibliotheken hinzugefügt.
TChrome-Registerkarten sind eine umfassende Implementierung des Tab-Systems von Google Chrome. Zu den Funktionen gehören vollständig animierte Registerkarten, Drag & Drop, automatische Größenänderung und Positionierung, Text von rechts nach links, benutzerdefinierte Registerkartenformen, vollständige Demo und vieles mehr.
29. Dezember 2020 Mozilla Public License 1.1 (MPL 1.1)
ICS ist eine Delphi-Bibliothek, die aus vielen Internetkomponenten besteht, die alle wichtigen Protokolle und Anwendungen unterstützen. Alle Komponenten sind ereignisgesteuert und nicht blockierend. Blockierungsversionen für einfachere Anwendungen. Beinhaltet OpenSSL 1.1.1i.
23. Dezember 2020 Urheberrechtlich geschützte Freeware
ICS ist eine Delphi-Bibliothek, die aus vielen Internetkomponenten besteht, die alle wichtigen Protokolle und Anwendungen unterstützen. Alle Komponenten sind ereignisgesteuert und nicht blockierend. Blockierungsversionen für einfachere Anwendungen. Beinhaltet OpenSSL 1.1.1i.
23. Dezember 2020 Urheberrechtlich geschützte Freeware
SynEdit für Delphi und CBuilder. Syntax, die das Bearbeitungssteuerelement hervorhebt, basiert nicht auf den allgemeinen Windows-Steuerelementen. Unterstützt auf Plattformen: Windows.
EWriter eBooks sind die moderne Alternative zum veralteten CHM-Format für die lokale Anwendungshilfe. Sie bieten vollständige Unterstützung für kontextsensitive Hilfe und Dateilinks. Sie kombinieren die Vorteile von CHM und WebHelp und beseitigen die Nachteile beider. Das Paket enthält die Einheit Vcl.EwriterHelpViewer.pas, die die Unterstützung für das eWriter-Hilfeformat im Delphi-Hilfesystem implementiert. Anwendungen, die derzeit CHM-Dateien für die Anwendungshilfe verwenden, können fast unverändert zur eWriter-Hilfe wechseln.
21. Dezember 2020 GNU General Public License (GPL)
Kryptografie-Bibliothek mit Hash-Algorithmen, einem kryptografischen Pseudozufallszahlengenerator und CRC- und Formatkonvertierungsklassen sowie Demoprojekten und einer umfangreichen Dokumentation.
Moderne Apps haben mehrere Threads, und mit diesem Plugin können Sie parallel debuggen: genauso wie Ihr Code ausgeführt wird! Sehen Sie sich mehrere Aufrufstapel an, führen Sie jeden Thread anstelle des gesamten Prozesses aus oder führen Sie ihn aus, sehen Sie die Ausführung mehrerer Threads direkt im Code-Editor – und vieles mehr.
RAD Studio-Experte zum Erstellen von NSIS- und Inno Setup-Installationsprogrammen aus der IDE. Es integriert NSIS (Nullsoft Scriptable Install System) und Inno Setup in die IDE und ermöglicht das Erstellen und Erstellen von NSIS- und Inno Setup-Projekten (Installationsprogrammen) direkt in RAD Studio, wobei alle Vorteile einer gemeinsamen integrierten Umgebung genutzt werden!
Berichtsgenerator FastReport FMX ist eine moderne Lösung zur Integration von Business Intelligence in Ihre Software. Es wurde für Entwickler erstellt, die vorgefertigte Komponenten für die Berichterstellung verwenden möchten. FastReport FMX bietet mit seiner einfachen Bedienung, Bequemlichkeit und geringen Verteilungsgröße eine hohe Funktionalität und Leistung auf fast jedem modernen PC.
AQtime ist ein integriertes Profiler-Toolkit, mit dem Sie Leistungsengpässe sowie Speicher- und Ressourcenlecks in Ihren Anwendungen finden und auf einfache Weise beseitigen können. Mit AQtime Standard für Embarcadero RAD Studio können Sie 32-Bit-Native-Code-Anwendungen profilieren, die mit Embarcadero RAD Studio XE6 – XE8, 10, 10.1 erstellt wurden.
RVMedia ist eine Reihe von Komponenten zum Anzeigen von Videos aus verschiedenen Quellen, zum Steuern von IP-Kameras, zum Organisieren von Video-Chats sowie zum Aufzeichnen von Audio- und Videodateien.
RVMedia ist eine Reihe von Komponenten zum Anzeigen von Videos aus verschiedenen Quellen, zum Steuern von IP-Kameras, zum Organisieren von Video-Chats, zum Aufzeichnen von Audio- und Videodateien (Windows-Plattform).
Abbrevia ist ein Komprimierungs-Toolkit für Delphi, C ++ Builder, Kylix und Free Pascal. Unterstützt auf folgenden Plattformen: Windows, Android, OS X, iOS.
Abbrevia ist ein Komprimierungs-Toolkit für Delphi, C ++ Builder, Kylix und Free Pascal. Unterstützt auf folgenden Plattformen: Windows, Android, OS X, iOS.
Tue Jan 05 2021 23:20:42 GMT+0700 (Western Indonesia Time)
Knights Province — это старая школа стратегии в реальном времени, в которой упор делается на стратегию, и она построена на Delphi. В настоящее время игра находится в альфа-версии. Эта игра — плод любви разработчика Крома, который работал над движком, который он использует, более ~ 12 лет, а саму игру — ~ 6 лет. По словам разработчика, «в отличие от многих современных RTS-игр, которые являются динамичными и часто в большей степени связаны с тактикой, КП планировала сделать упор на« стратегический »компонент. Более медленный игровой процесс, создание базы, сбор и обработка ресурсов, углубленный стратегический выбор, разнообразие ресурсов и юнитов, внимание к деталям ». Кроме того, о технологии создания игры разработчик говорит: «Knights Province разрабатывается на Delphi (Object Pascal) с нуля. Графика написана в соответствии со спецификациями OpenGL ES2.0. Основная целевая платформа — настольная Windows. Пока не тестировалась, но также должна работать. отлично работает с Wine на платформах Linux и MacOS. Код совместим и работает на Android, хотя графический интерфейс и элементы управления не настроены должным образом. Многопользовательская игра будет использовать Overbyte ICS. Звуковые эффекты — OpenAL ». Вау, ребята, впечатляющие достижения!
Tue Jan 05 2021 23:19:52 GMT+0700 (Western Indonesia Time)
Knights Province é um jogo RTS da velha escola que enfatiza a estratégia e é construído em Delphi. O jogo está atualmente em Alpha. Este jogo é um trabalho de amor do desenvolvedor Krom, que está trabalhando no motor que ele usa há mais de 12 anos e no próprio jogo há cerca de 6 anos. De acordo com o desenvolvedor, “ao contrário de muitos jogos RTS modernos, que são rápidos e muitas vezes são mais sobre táticas, o KP planejou enfatizar o componente de” estratégia “. Jogabilidade mais lenta, construção de base, coleta e processamento de recursos, em profundidade escolhas estratégicas, variedade de recursos e unidades, atenção aos detalhes. ” Além disso, sobre a tecnologia para construir o jogo, o desenvolvedor diz “Knights Province foi desenvolvido em Delphi (Object Pascal) do zero. Os gráficos são escritos de acordo com as especificações do OpenGL ES2.0. A plataforma de destino principal é o Windows desktop. Ainda não testado, mas também deve funcionar bem com Wine nas plataformas Linux e MacOS. O código é compatível e roda no Android também, embora a GUI e os controles não sejam devidamente manipulados. O multijogador usará Overbyte ICS. Os efeitos sonoros são OpenAL. ” Uau, conquista impressionante galera!
Tue Jan 05 2021 23:18:17 GMT+0700 (Western Indonesia Time)
Knights Province ist ein RTS-Spiel der alten Schule, das den Schwerpunkt auf Strategie legt und in Delphi entwickelt wurde. Das Spiel ist derzeit in der Alpha. Dieses Spiel ist ein Werk der Liebe von Entwickler Krom, der an der Engine, die es verwendet, über ~12 Jahre und das Spiel selbst für ~6 Jahre gearbeitet hat. Laut dem Entwickler „im Gegensatz zu vielen modernen RTS-Spielen, die schnell sind und oft mehr über Taktik, KP geplant, um auf „Strategie“-Komponente zu betonen. Langsameres Gameplay, Aufbau von Basen, Sammeln und Verarbeiten von Ressourcen, tiefgreifende strategische Entscheidungen, Vielfalt von Ressourcen und Einheiten, Aufmerksamkeit für Details.“ Über die Technologie, mit der das Spiel entwickelt wurde, sagt der Entwickler: „Knights Province ist von Grund auf in Delphi (Object Pascal) entwickelt. Die Grafik ist gegen OpenGL ES2.0-Spezifikationen geschrieben. Hauptzielplattform ist Desktop-Windows. Noch ungetestet, sollte aber auch mit Wine auf Linux und MacOS Plattformen funktionieren. Der Code ist kompatibel und läuft auch auf Android, obwohl GUI und Bedienelemente nicht richtig angepasst sind. Multiplayer wird Overbyte ICS verwenden. Soundeffekte sind OpenAL.“ Wow, beeindruckende Leistung Jungs!
Tue Jan 05 2021 23:18:01 GMT+0700 (Western Indonesia Time)
WmHelp XMLPad — это мощный собственный редактор Windows XML, встроенный в Delphi. Он имеет огромное количество функций, включая мощный редактор XML, XSD и DTD с цветовой подсветкой синтаксиса, номерами строк, навигацией по диапазону элементов и контекстно-зависимым мастером помощника по исходным текстам. Кроме того, он имеет возможность редактировать DTD и XML с использованием представлений дерева и свойств, синхронизированных с обычной навигацией редактора, а также редактировать XML с использованием современного представления сетки и предварительного просмотра во встроенном окне браузера. Вы также можете сгенерировать образец XML из схемы DTD и образец DTD из файла XML и предварительно просмотреть схему DTD в графическом окне Diagram. Другие функции включают проверку по запросу и онлайн-проверку схемы DTD и файлов XML на соответствие базовым схемам DTD. Он включает командную интеграцию с поддержкой CVS. Наконец, в нем есть мощный конструктор выражений XPath. XmlPad — это собственное приложение Windows с низким объемом памяти, и Delphi помогает ему реализовать этот набор функций. На сайте разработчиков также есть версия для iOS.
Tue Jan 05 2021 23:16:49 GMT+0700 (Western Indonesia Time)
WmHelp XMLPad é um poderoso editor de XML nativo do Windows e é construído em Delphi. Possui um grande número de recursos, incluindo um poderoso editor de XML, XSD e DTD com destaque de sintaxe de cores, números de linha, navegação de intervalo de elemento e assistente de assistente de fonte dependente do contexto. Além disso, ele tem edição de DTD e XML usando as visualizações de árvore e propriedades, sincronizadas com a navegação normal do editor, além de edição de XML usando o modo de exibição de grade e visualização na janela embutida do navegador. Você também pode gerar a amostra do XML do esquema DTD e a amostra do DTD do arquivo XML e visualizar o esquema DTD na janela do diagrama gráfico. Outros recursos incluem validação on-demand e sob demanda para o esquema DTD e arquivos XML em relação aos esquemas DTD subjacentes. Possui integração de equipe com suporte CVS. Por último, apresenta um poderoso construtor de expressões XPath. O XmlPad é um aplicativo nativo do Windows com pouca memória e o Delphi o ajuda a fornecer esse conjunto de recursos. O site dos desenvolvedores também apresenta uma versão iOS.
Tue Jan 05 2021 23:15:55 GMT+0700 (Western Indonesia Time)
WmHelp XMLPad es un potente editor XML nativo de Windows y está integrado en Delphi. Tiene una gran cantidad de funciones, incluido un potente editor XML, XSD y DTD con resaltado de sintaxis de color, números de línea, navegación de rango de elementos y asistente de asistente de fuente dependiente del contexto. Además, ha editado el DTD y XML usando el árbol y las vistas de propiedades, sincronizado con la navegación del editor regular, además de editar XML usando la vista de cuadrícula de última generación y la vista previa en la ventana del navegador integrado. También puede generar la muestra de XML desde el esquema DTD y la muestra de DTD desde el archivo XML y obtener una vista previa del esquema DTD en la ventana de diagrama gráfico. Otras características incluyen la validación en línea y bajo demanda para el esquema DTD y los archivos XML contra los esquemas DTD subyacentes. Cuenta con integración de equipo con soporte CVS. Por último, cuenta con un potente generador de expresiones XPath. XmlPad es una aplicación nativa de Windows con poca memoria y Delphi le ayuda a ofrecer ese conjunto de funciones. El sitio web de los desarrolladores también cuenta con una versión para iOS.
Tue Jan 05 2021 23:15:31 GMT+0700 (Western Indonesia Time)
WmHelp XMLPad ist ein leistungsstarker nativer Windows XML-Editor und wurde in Delphi erstellt. Er verfügt über eine große Anzahl an Funktionen, u.a. einen leistungsstarken XML-, XSD- und DTD-Editor mit farbiger Syntaxhervorhebung, Zeilennummern, Elementbereichsnavigation und einem kontextabhängigen Assistenten für den Quellcode. Zusätzlich bietet es die Bearbeitung der DTD und XML mit Hilfe der Baum- und Eigenschaftsansicht, synchronisiert mit der regulären Editornavigation, sowie die Bearbeitung von XML mit Hilfe der hochmodernen Grid-Ansicht und der Vorschau im integrierten Browserfenster. Sie können auch das XML-Muster aus dem DTD-Schema und das DTD-Muster aus der XML-Datei generieren und eine Vorschau des DTD-Schemas im grafischen Diagrammfenster anzeigen. Weitere Funktionen sind die On-Demand- und Online-Validierung von DTD-Schemas und XML-Dateien anhand der zugrunde liegenden DTD-Schemas. Es bietet Teamintegration mit CVS-Unterstützung. Und schließlich bietet es einen leistungsstarken XPath-Ausdrucksersteller. XmlPad ist eine native Windows-Applikation mit geringem Speicherbedarf und Delphi hilft ihr dabei, diesen Funktionsumfang bereitzustellen. Die Entwickler-Website bietet auch eine iOS-Version an.
Fri Jan 01 2021 00:05:25 GMT+0700 (Western Indonesia Time)
BVS Solitaire Collection — это лучшая коллекция пасьянсов, включающая более 535 различных игр и созданная на Delphi. В этой коллекции представлены пасьянсы, которых, по словам разработчика, больше нигде нет. Кроме того, вы можете изменять правила практически любой из включенных игр, создавая таким образом свой собственный вариант пасьянса. BVS Solitaire Collection предоставляет вам множество экранов статистики и скоринга для отслеживания ваших исторических данных. Вы также можете сразиться с ним в списке лучших рекордов на веб-сайте BVS Solitaire Collection. Версия BVS Solitaire Collection для Windows даже была показана в фильме «Девушка с татуировкой дракона» (2011). Он имеет несколько языков и множество разных стилей для пользовательского интерфейса. Это действительно показывает мощь и универсальность Delphi FireMonkey, поскольку он сочетает в себе богатую графику с собственным (и настраиваемым по темам) внешним видом Windows.
Fri Jan 01 2021 00:05:08 GMT+0700 (Western Indonesia Time)
BVS Solitaire Collection é a coleção definitiva de paciência com mais de 535 jogos diferentes e é construída em Delphi. Esta coleção apresenta jogos de paciência não encontrados em nenhum outro lugar de acordo com o desenvolvedor. Além disso, você pode modificar as regras de quase qualquer um dos jogos incluídos, criando assim sua própria variação de paciência. O BVS Solitaire Collection oferece uma infinidade de telas estatísticas e de pontuação para rastrear seu registro histórico. Você também pode batalhar na lista de melhores pontuações no site da coleção BVS Solitaire. A versão para Windows da BVS Solitaire Collection foi até apresentada no filme “The Girl With The Dragon Tattoo” (2011). Possui vários idiomas e muitos estilos diferentes para a IU. Isso realmente mostra o poder e a versatilidade do Delphi FireMonkey, pois combina gráficos ricos com uma aparência nativa (e temática) do Windows.
Fri Jan 01 2021 00:04:37 GMT+0700 (Western Indonesia Time)
BVS Solitaire Collection es la última colección de solitario con más de 535 juegos diferentes y está construida en Delphi. Esta colección presenta solitarios que no se encuentran en ningún otro lugar según el desarrollador. Además, puede modificar las reglas de casi cualquiera de los juegos incluidos, creando así su propia variación de solitario. BVS Solitaire Collection le ofrece una gran cantidad de pantallas estadísticas y de puntuación para realizar un seguimiento de su registro histórico. También puede luchar en la lista de puntajes más altos en el sitio web de BVS Solitaire Collection. La versión para Windows de BVS Solitaire Collection incluso apareció en la película “The Girl With The Dragon Tattoo” (2011). Cuenta con varios idiomas y muchos estilos diferentes para la interfaz de usuario. Esto realmente muestra el poder y la versatilidad de Delphi FireMonkey, ya que combina gráficos ricos con un aspecto nativo (y temático) de Windows.
Fri Jan 01 2021 00:04:24 GMT+0700 (Western Indonesia Time)
BVS Solitaire Collection ist die ultimative Solitaire-Sammlung mit über 535 verschiedenen Spielen und ist in Delphi erstellt. Diese Sammlung bietet Solitär-Spiele, die laut Entwickler nirgendwo anders zu finden sind. Außerdem können Sie die Regeln fast aller enthaltenen Spiele modifizieren und so Ihre eigene Solitaire-Variante erstellen. BVS Solitaire Collection bietet Ihnen eine Fülle von Statistik- und Wertungsbildschirmen, um Ihre historische Bilanz zu verfolgen. Sie können auch auf der BVS Solitaire Collection-Webseite gegen die Top-Highscore-Liste antreten. Die Windows-Version von BVS Solitaire Collection wurde sogar in dem Film „The Girl With The Dragon Tattoo“ (2011) gezeigt. Es bietet mehrere Sprachen und viele verschiedene Stile für die Benutzeroberfläche. Dies zeigt wirklich die Stärke und Vielseitigkeit von Delphi FireMonkey, da es reichhaltige Grafiken mit einem nativen (und thematisierbaren) Windows-Look kombiniert.
Thu Dec 31 2020 17:35:25 GMT+0700 (Western Indonesia Time)
Когда несколько выпусков назад FireMonkey представила предварительный просмотр FireUI, приложение было доступно в магазинах Google и Apple, чтобы упростить развертывание на устройстве. Это же приложение также является демонстрационным, доступным в виде исходного кода, но для его компиляции и развертывания на устройстве требуется несколько шагов настройки. Наличие предварительно созданной, готовой к использованию версии — хорошее преимущество.
Как только это будет установлено на вашем устройстве, вам необходимо включить View | Функция широковещательной передачи на устройства в RAD Studio IDE, откройте форму FireMonkey и из приложения подключитесь к IDE на указанном ПК (обратите внимание, что для этого требуется, чтобы ПК или виртуальная машина, на которой запущена IDE, и устройство находились в одной внутренней сети. ):
Теперь, если вы откроете форму в конструкторе в среде IDE, например:
Вы сразу увидите его на устройстве в предварительном просмотре приложения FireUI в правильном стиле, и любое изменение, внесенное в форму во время разработки, будет немедленно отражено в предварительном просмотре устройства:
Конечно, если вы откроете проект с более полным пользовательским интерфейсом, например демонстрацию Accelerometer, вы увидите, что он отображается на вашем устройстве перед его компиляцией и развертыванием:
Это помогает значительно сократить время, необходимое для разработки пользовательского интерфейса приложения и просмотра его на реальном устройстве, что значительно сокращает время разработки. В этой области FireMonkey предлагает гораздо лучший опыт, чем большинство других инструментов разработки для нескольких устройств!
Thu Dec 31 2020 17:34:46 GMT+0700 (Western Indonesia Time)
Quando o FireMonkey apresentou o FireUI Preview alguns lançamentos atrás, o aplicativo estava disponível nas lojas do Google e da Apple para simplificar a implantação em um dispositivo. O mesmo aplicativo também é uma demonstração disponível como código-fonte, mas que requer algumas etapas de configuração para ser capaz de compilar e implantar em um dispositivo. Ter uma versão pré-construída pronta para usar é uma grande vantagem.
Assim que estiver instalado no seu dispositivo, você precisa habilitar o View | Transmita para o recurso de dispositivos do IDE RAD Studio, abra um formulário FireMonkey e, do aplicativo, conecte-se ao IDE no PC listado (observe que isso requer que o PC ou VM executando o IDE e o dispositivo estejam na mesma rede interna ):
Agora, se você abrir um formulário no designer no IDE, como o seguinte:
Você o verá imediatamente no dispositivo na visualização do aplicativo FireUI, com o estilo adequado, e qualquer alteração feita no formulário em tempo de design será imediatamente refletida na visualização do dispositivo:
Claro, se você abrir um projeto com uma IU mais completa, como a demonstração do Acelerômetro, você o verá sendo exibido no seu dispositivo, antes de compilá-lo e implantá-lo:
Isso ajuda a reduzir significativamente o tempo que leva para projetar a IU de um aplicativo e vê-lo em um dispositivo real, reduzindo significativamente o tempo de desenvolvimento. Nesta área, o FireMonkey oferece uma experiência muito melhor do que a maioria das outras ferramentas de desenvolvimento de vários dispositivos disponíveis!
Thu Dec 31 2020 17:34:02 GMT+0700 (Western Indonesia Time)
Cuando FireMonkey introdujo FireUI Preview hace algunas versiones, la aplicación estaba disponible en las tiendas de Google y Apple, para simplificar la implementación en un dispositivo. La misma aplicación también es una demostración disponible como código fuente, pero requiere algunos pasos de configuración para poder compilar e implementar en un dispositivo. Tener una versión prediseñada lista para usar es una gran ventaja.
Una vez que esté instalado en su dispositivo, debe habilitar Ver | Transmitir a la función de dispositivos del RAD Studio IDE, abra un formulario FireMonkey y, desde la aplicación, conéctese al IDE en la PC indicada (tenga en cuenta que esto requiere que tanto la PC o VM que ejecutan el IDE como el dispositivo estén en la misma red interna ):
Ahora, si abre un formulario en el diseñador en el IDE, como el siguiente:
Lo verá inmediatamente en el dispositivo en la Vista previa de la aplicación FireUI, con el estilo adecuado, y cualquier cambio que realice en el formulario en el momento del diseño se reflejará inmediatamente en la vista previa del dispositivo:
Por supuesto, si abre un proyecto con una interfaz de usuario más completa, como la demostración del Acelerómetro, lo verá en su dispositivo, antes de compilarlo e implementarlo:
Esto ayuda a reducir significativamente el tiempo que lleva diseñar la interfaz de usuario de una aplicación y verla en un dispositivo real, lo que reduce significativamente el tiempo de desarrollo. En esta área, FireMonkey ofrece una experiencia mucho mejor que la mayoría de las otras herramientas de desarrollo de dispositivos múltiples que existen.
Thu Dec 31 2020 17:33:13 GMT+0700 (Western Indonesia Time)
Als FireMonkey vor ein paar Jahren die FireUI-Vorschau vorstellte, war die Anwendung in den Google- und Apple-Stores verfügbar, um die Bereitstellung auf einem Gerät zu vereinfachen. Die gleiche App ist auch eine Demo, die als Quellcode verfügbar ist, aber das erfordert ein paar Konfigurationsschritte, um kompilieren und auf einem Gerät bereitstellen zu können. Eine vorgefertigte, einsatzbereite Version zu haben, ist ein netter Vorteil.
Sobald dies auf Ihrem Gerät installiert ist, müssen Sie die Funktion „View | Broadcast to devices“ der RAD Studio-IDE aktivieren, ein FireMonkey-Formular öffnen und von der App aus eine Verbindung zur IDE auf dem aufgeführten PC herstellen (beachten Sie, dass sich sowohl der PC oder die VM, auf dem die IDE läuft, als auch das Gerät im selben internen Netzwerk befinden müssen):
Wenn Sie nun ein Formular im Designer in der IDE öffnen, wie das folgende:
Sie sehen es sofort auf dem Gerät in der FireUI App Preview, mit dem richtigen Stil, und jede Änderung, die Sie zur Designzeit am Formular vornehmen, wird sofort in der Gerätevorschau angezeigt:
Wenn Sie ein Projekt mit einer vollständigeren Benutzeroberfläche öffnen, wie z. B. die Accelerometer-Demo, sehen Sie es natürlich auf Ihrem Gerät, bevor Sie es kompilieren und bereitstellen:
Dadurch wird die Zeit, die benötigt wird, um das UI einer App zu entwerfen und es auf einem tatsächlichen Gerät zu sehen, erheblich verkürzt, was die Entwicklungszeit deutlich reduziert. In diesem Bereich bietet FireMonkey eine viel bessere Erfahrung als die meisten anderen Multi-Device-Entwicklungstools da draußen!
Thu Dec 31 2020 04:24:11 GMT+0700 (Western Indonesia Time)
Happy New Year! It’s time to review the big trends in JavaScript and technology in 2020 and consider our momentum going into 2021.
Our aim is to highlight the learning topics and technologies with the highest potential job ROI. This is not about which ones are best, but which ones have the most potential to land you (or keep you in) a great job in 2021. We’ll also look at some larger tech trends towards the end.
Language Rankings
JavaScript still reigns supreme on GitHub and Stack Overflow. Tip #1: Learn JavaScript, and in particular, learn functional programming in JavaScript. Most of JavaScript’s top frameworks, including React, Redux, Lodash, and Ramda, are grounded in functional programming concepts.
TypeScript jumped past PHP, and C# into 4th place, behind only Java, Python, and JavaScript. Python climbed past Java for 2nd place, perhaps on the strength of the rapidly climbing interest in AI and the PyTorch library for GPU-accelerated dynamic, deep neural networks, which makes experimentation with network structures easier and faster.
Source: GitHub State of the Octoverse, 2020
JavaScript is also #1 on Stack Overflow for the 8th year in a row. Python, Java, C#, PHP, and TypeScript beat out languages like C++, C, Go, Kotlin, and Ruby.
Frameworks
When it comes to front-end frameworks, a large majority of JavaScript developers use React, Vue.js, or Angular. jQuery still makes a surprisingly large showing, almost double the Vue.js showings, but it’s my guess that jQuery is used less in application work, and more in content sites and WordPress templates, so we’re going to exclude it this year.
Search Volume
React dominates search volume at 57.5%, with Angular collecting a large 31.5% share, and Vue.js picking up a respectable 11% slice.
*Methodology: All search trends were selected by topic rather than by keyword to exclude false positives.
Jobs
If you want to learn the framework that will give you the best odds of landing a job in 2021, your best bet is still React, and has been since 2017. React is mentioned in 47.6% of the listings which mention a common front-end framework, Angular picks up 41.2%, and Vue.js trails at 11.2%.
It’s important to mention that most job listings say that they require experience with one of a few named frameworks, but a large share of those listings are actually hiring for React work when you look at their listed tech stack, and will show preference to candidates with a strong knowledge of React. You’ll see some supporting evidence of that in the download trends, below.
*Methodology: Job searches were conducted on Indeed.com. To weed out false positives, I paired searches with the keyword “software” to strengthen the chance of relevance. I also omitted the “.js” from “Vue.js” because many listings don’t include the “.js”. All SERPS were sorted by date and spot checked for relevance.
Downloads
The npm download counts look fairly similar to the search trends, but reveal something interesting: The number of downloads for Angular 2+ and Vue.js are pretty much neck-and-neck, but if you add in the number of people using the old Angular framework, Angular has a solid lead over Vue.js in downloads.
Developer interest in TypeScript is undeniably strong, and growing rapidly. I predict that this trend will continue in 2021, and users will learn to work around some of the costs of using TypeScript (for example, by favoring interfaces over inline type annotations).
The number of jobs that specifically mention TypeScript is still relatively small, but some experience with TypeScript will slightly increase your odds of landing a job in 2021. By 2022, some experience with TypeScript might give you an edge in the job market. However, because it’s easier for a JavaScript developer to learn TypeScript than a completely new language, TypeScript teams are usually willing to hire and train good JavaScript developers.
Server Frameworks
On the server side, Express still dominates in download counts, so much so that it’s difficult to see how popular contenders are doing relative to each other.
As I predicted last year, excluding express, we see that Next.js has emerged as the top contender, which is unsurprising because Next.js is a flexible, full-stack, React-based framework which can help you deliver statically optimized content, but can also fall-back on serverless functions for API routes and SSR when you need to generate content dynamically. You can even statically generate content on-demand the first time it’s requested, and subsequently serve cached static content served from CDN — useful for apps based on user-generated content.
Next has many other advantages, including automatic optimization of page bundles, automatic image optimization with the new Image tag and built-in performance analytics to help you improve your user’s page load experience.
If you use GitHub and deploy on Vercel, you’ll also get automatic deploys for every PR, and a buttery smooth CI/CD pipeline. Essentially, it’s like having the best full-time DevOps team on staff, but instead of paying them salaries, you save a significant amount of money in hosting bills.
Expect Next.js to continue to explode in 2021.
Remote Work Trends
In 2020, teams were forced to learn to collaborate remotely by a global pandemic. In 2021, remote work will continue to be an important topic. First, because it will probably be June before vaccination against COVID-19 is widespread, and second, because a lot of teams experienced increased productivity and reduced costs during lockdown, manyemployeeswillnotreturnto offices in 2021.
Remote work has also led to more location freedom, prompting developers to move to places where they have access to things that are important to them, such as family and more affordable housing. Additionally, 72% of employers surveyed by KPMG said that remote work has widened their potential talent pool.
Remote-first and hybrid-remote teams will be the new normal in the new decade.
Average JavaScript Developer salaries dipped slightly in 2020, from $114k/year to $113k/year, according to Indeed, perhaps due in part to remote work expanding the employee pool beyond tech centers like San Francisco and New York, which tend to have a much higher cost of living, and demand higher salaries to compensate. The average JavaScript Developer salary in San Francisco is $130k.
Still, lots of companies with roots in San Francisco and other tech centers are paying remote workers somewhere between the US national average and San Francisco pay, which provides a premium on market rates to attract better talent, and still saves money over hiring locally and paying for office space.
Because of this trend, lots of remote jobs exist in the $115k — $130k range for mid-level developers. Senior developers often find jobs in the $120k — $150k range, regardless of location.
GitHub data suggests that rather than slowing down, teams were more productive working remotely in 2020. GitHub activity spiked when lockdowns began.
Source: GitHub State of the Octoverse, 2020
Volume of work on GitHub increased substantially, and average pull request merge times dropped by 7.5 hours.
Toss that onto the growing pile of evidence that remote work works.
Passwords are Obsolete
Passwords are obsolete, insecure technology and absolutely should not be used to protect your users or your app in 2021.
The crux of the matter is that about half of all users reuse passwords on multiple applications and websites, and attackers are financially incentivized to bring massive computing power to the problem of cracking your user’s passwords so they can try them on bank accounts, Amazon, etc.
If you’re not Google, Microsoft, or Amazon, chances are you can’t afford the computing power required to defend against modern password crackers. Don’t believe me? Check out HaveIBeenPwned. Spoiler: If you’ve used the internet, your passwords have been stolen.
I’ve been warning about the dangers of passwords for years, but in 2020, new optionsemerged which allow us to leave passwords behind, permanently. It was true in 2020, and it remains true: No new app should use passwords in 2021.
But once you leave passwords behind in exchange for cryptographic key pairs, your app also gains Web3 superpowers. Which leads me to the next topic: Crypto.
Crypto
Crypto will continue to be one of the most important and globally transformational technologies in 2021. Here are some highlights from 2020:
Bitcoin exploded to new all time highs, thanks in part to notable support from companies like PayPal. Expect more of the same in 2021.
Ethereum 2.0 beacon chain launched, which lays the groundwork for Ethereum to become a much more scalable platform. Additionally, scalability solutions such as side-chains and zkRollups gained momentum in 2020. Expect to see more DApps (Decentralized Apps) integrate those scaling solutions in 2021.
DeFi (Decentralized Finanance) is now a $15 billion market (up from $650 million when I wrote last year’s edition of this post), mostly operating on the Ethereum blockchain. Many multi-million-dollar exploits plagued the DeFi ecosystem in 2020. Smart contract security will continue to be a hot topic and huge opportunity in 2021.
Non-Fungible Tokens (NFTs) gained momentum in 2020, with several high profile sales of single tokens priced in the tens of thousands of dollars, each. Rarible introduced their own community token and began to airdrop it to marketplace users, fueling increased volume. Millions of dollar’s worth of NFTs are bought and sold daily, but this is just the beginning. Because they can represent virtually anything of value, the total addressable market is in the $trillions.
The Flow blockchain launched and brought with it lots of promise for mainstream blockchain adoption. NBA Top Shot has sold over $6 million in NBA-branded NFT moments, which represent short video clips of key moments in NBA games.
Theta Network launched smart contracts and NFTs. Among other things, NFTs will be used for stickers and badges on Theta.tv, a decentralized alternative to Twitch with millions of monthly active users.
Artificial Intelligence (AI)
2020 was a seminal year for AI. Via the GPT-3 launch, we learned that language models and transformers in general may be a viable path towards Artificial General Intelligence (AGI).
The human mind’s ability to generally solve a wide variety of problems by relating them to things we already know is known in AI circles as zero-shot and few-shot learning. We don’t need a lot of instruction or examples to take on tasks that are new to us. We can often figure out new kinds of problems with just a few (or no) examples (shots).
That general applicability of human cognitive skills is known as general intelligence. In AI, Artificial General Intelligence (AGI) is “the hypothetical intelligence of a machine that has the capacity to understand or learn any intellectual task that a human being can.”
GPT-3 demonstrated that it could teach itself math, how to code, how to translate text, and a virtually infinite variety of other skills via its gigantic training set which includes basically the whole public web (Common Crawl, WebText2, Books1, Books2, and Wikipedia), combined with its enormous model size. GPT-3 uses 175 billion parameters. For context, that’s an order of magnitude (10x) the previous state of the art, but still orders of magnitude smaller than the human brain.
Scaling up GPT-3 is likely to lead to even more breakthroughs in what it is capable of.
Self Driving Cars
In October 2020, Waymo began offering fully driverless rides (with no human in the driver seat) on 100% of their rides. At the time of launch, there were 1500 monthly active users and hundreds of cars serving the Phoenix metro area.
In December, 2020, General Motors’ Cruise launched fully driverless rides on the streets of San Francisco.
Drone Delivery
UPS launched 2 drone trials in 2020. One to deliver prescriptions to a retirement community in Florida, and another to deliver medical supplies including Personal Protective Equipment (PPE) between health care facilities in North Carolina.
Regulations, safety, noise, and technical challenges will likely continue to mean slow growth for Drone delivery services in 2021, but with continued COVID restrictions that will likely continue off and on through at least June, there has never been a better time to make quick progress on more efficient and contactless delivery.
Quantum Computing
Researchers in China have reported that they have achieved quantum supremacy that is 10 billion times faster than the quantum supremacy reported by Google last year. Researchers are making rapid progress, but quantum computing still requires extremely expensive hardware, and there are only a small handful of quantum computers in the world that have achieved any kind of quantum superiority.
Quantum-resistant cryptography, quantum-assisted cryptography, and quantum computing for machine learning are potential areas of focus where breakthroughs would have a significant industry-spanning, global impact. I believe that one day, the application of quantum computing in the field of AI will propel the technology forward many orders of magnitude — a feat that will have a profound impact on the human race.
In my opinion, that is unlikely to happen in the 2020s, but I expect to hear more quantum supremacy announcements in 2021, and perhaps breakthroughs in the variety of algorithms state of the art quantum computers can compute. We may also see more practical quantum-computing APIs services and use-cases.
Learn React, Redux, Next.js, TDD and more on EricElliottJS.com. Access a treasure trove of video lessons and interactive code exercises for members.
1:1 Mentorship is hands down, the best way to learn software development. DevAnywhere.io provides lessons on functional programming, React, Redux, and more, guided by an experienced mentor using detailed curriculum designed by Eric Elliott.
Eric Elliott is a tech product and platform advisor, author of “Composing Software”, cofounder of EricElliottJS.com and DevAnywhere.io, and dev team mentor. He has contributed to software experiences for Adobe Systems, Zumba Fitness,The Wall Street Journal,ESPN,BBC, and top recording artists including Usher, Frank Ocean, Metallica, and many more.
He enjoys a remote lifestyle with the most beautiful woman in the world.
Wed Dec 30 2020 17:33:40 GMT+0700 (Western Indonesia Time)
С Change Views у вас есть запатентованный метод работы, который намного проще разработать и масштабировать для вашей клиентской базы. Используя InterBase Change Views, теперь вы можете точно определить, какие дельты были изменены на уровне поля.
Представления изменений — это модель на основе подписки, используемая для подписки на некоторые данные и определения того, какие данные были изменены в вашей базе данных InterBase. Вы создаете подписку, охватывающую разные таблицы и столбцы, и позволяете пользователям подписываться на изменения в данных.
Во время подключения вы можете получить предупреждение, а затем получить свои дельта-изменения или использовать компонент TFDEventAlerter в Delphi / C ++ Builder и даже изменения, связанные с цветовым кодом. Чтобы охватить соединение, вам не нужно быть подключенным, чтобы оно записывало изменения. После запуска транзакции базы данных у вас может быть активна подписка, затем отключиться от базы данных, а затем начать новое соединение с новой транзакцией в будущем.
С помощью Change Views вы:
Снижение затрат и дискового ввода-вывода за счет минимизации синхронизации данных
Слабое влияние на производительность
Нет внешних журнальных таблиц
Масштабируемость пользователей, даже мобильных
Отслеживайте изменения так, как хотите
Реализация представлений изменений с помощью FireDAC
Посмотрите это короткое 4-минутное видео об использовании просмотра изменений и о том, как начать отслеживать изменения данных.
Если вы хотите попробовать использовать представления изменений, вы можете взглянуть на демонстрационное приложение Generic Change Views, которое я продемонстрировал выше, которое поставляется с Delphi.
Wed Dec 30 2020 08:00:04 GMT+0700 (Western Indonesia Time)
One of the most interesting changes in the year of 2020 was the high increase in the number of people working from home. According to this article from the World Economic Forum, “roughly 35 to 40% of employees in developed economies have reported working from home most or all of the time during the pandemic, a marked increase from the past.”
This article also bring the interesting statistics that “a fifth of the workforce in advanced economies can work just as effectively from home” as depicted in the graph below:
It is also clear that people were initially forced to work from home because of the Covid pandemic, but most of them actually enjoyed it. According to this article in the British site YouGov, “once the crisis is over, most (57%) of those who were working before the outbreak and who intend to stay part of the workforce say they want to be able to continue working from home.”
The graph below shows workers expectations once Coronavirus is over:
There are many reasons people want to continue working from home. According to this article from the Business Standard, “69% prefer work from home to continue to avoid traffic.”
The graph below presents some of the main reasons people want to continue working from home:
The Downside of WFH
So apparently working from home is very desirable and has many benefits. But is there any negative aspect in this new reality of remote work?
In my personal opinion, very soon we will observe increased competition when looking for a new job. If this job position can be performed remotely, this means that candidates will now be competing with people who live in different cities, perhaps in other states, and possibly even in other countries.
I do expect that for many remote job positions there will still be some limitations related to time-zones, since in general we want co-workers to be able to communicate easily with each other.
But, if a person is able to participate in all required meetings, and if this person is able to communicate in the same language as the co-workers, and has the skills and experience to perform the job, then it is possible to work from anywhere in the world.
Yes, remote working is here to stay. Enjoy the benefits, but prepare for the competition.
Wed Dec 30 2020 00:07:29 GMT+0700 (Western Indonesia Time)
Con Change Views, tiene este método patentado con el que trabajar y que es mucho más fácil de desarrollar y escalar para su base de clientes. Con las vistas de cambio de InterBase, ahora puede identificar específicamente qué deltas han cambiado a nivel de campo.
Las vistas de cambio son un modelo basado en suscripción que se utiliza para suscribirse a algunos datos e identificar qué datos han cambiado en su base de datos de InterBase. Crea una suscripción que cubre diferentes tablas y columnas y permite a los usuarios los derechos para suscribirse a cambios en los datos.
Durante una conexión, puede recibir una alerta y luego buscar sus cambios delta o usar un componente TFDEventAlerter en Delphi / C ++ Builder e incluso cambios específicos del código de color. Para abarcar una conexión, no es necesario que esté conectado para que registre los cambios. Una vez que inicie una transacción de base de datos, puede tener una suscripción activa, luego desconectarse de su base de datos y luego iniciar una nueva conexión con una nueva transacción en un momento futuro.
Con Cambiar vistas, usted:
Reduzca los costos y la E / S del disco minimizando las sincronizaciones de datos
Tienen poco impacto en el rendimiento.
Sin tablas de registro externas
Escalabilidad de usuarios, incluso móviles
Realice un seguimiento de los cambios de la forma que desee
Implementación de vistas de cambio con FireDAC
Vea este breve video de 4 minutos sobre el uso de Cambiar vistas y cómo puede comenzar a rastrear cambios en los datos.
Si desea probar el uso de Cambiar vistas, puede echar un vistazo a la aplicación de muestra de Vistas genéricas de cambio que demostré anteriormente que se incluye con Delphi.
Wed Dec 30 2020 00:07:02 GMT+0700 (Western Indonesia Time)
Mit Change Views können Sie mit dieser patentierten Methode arbeiten, die für Ihren Kundenstamm viel einfacher zu entwickeln und zu skalieren ist. Mithilfe von InterBase-Änderungsansichten können Sie jetzt genau identifizieren, welche Deltas sich auf Feldebene geändert haben.
Änderungsansichten sind ein abonnementbasiertes Modell, mit dem Sie einige Daten abonnieren und feststellen können, welche Daten sich in Ihrer InterBase-Datenbank geändert haben. Sie erstellen ein Abonnement, das verschiedene Tabellen und Spalten abdeckt, und gewähren Benutzern die Rechte, Änderungen an den Daten zu abonnieren.
Während einer Verbindung können Sie eine Warnung erhalten und dann Ihre Delta-Änderungen abrufen oder eine TFDEventAlerter- Komponente in Delphi / C ++ Builder und sogar farbcodespezifische Änderungen verwenden. Um eine Verbindung zu überspannen, müssen Sie nicht verbunden sein, um die Änderungen aufzuzeichnen. Sobald Sie eine Datenbanktransaktion gestartet haben, können Sie ein Abonnement aktivieren, die Verbindung zu Ihrer Datenbank trennen und zu einem späteren Zeitpunkt eine neue Verbindung mit einer neuen Transaktion herstellen.
Mit Ansichten ändern:
Reduzieren Sie Kosten und Festplatten-E / A, indem Sie die Datensynchronisierung minimieren
Haben wenig Einfluss auf die Leistung
Keine externen Protokolltabellen
Skalierbarkeit von Benutzern, auch von mobilen
Verfolgen Sie Änderungen nach Ihren Wünschen
Implementieren von Änderungsansichten mit FireDAC
In diesem kurzen 4-minütigen Video erfahren Sie, wie Sie Ansichten ändern verwenden und wie Sie Datenänderungen verfolgen können.
Wenn Sie die Verwendung von Änderungsansichten ausprobieren möchten, können Sie sich die oben gezeigte Beispielanwendung für generische Änderungsansichten ansehen, die im Lieferumfang von Delphi enthalten ist.
Tue Dec 29 2020 23:50:14 GMT+0700 (Western Indonesia Time)
Lumicademy — это платформа как услуга для обеспечения виртуального обучения в реальном времени, которую клиенты могут добавить к своим существующим продуктам или услугам, и она написана на Delphi с использованием Firemonkey. По словам разработчиков, если вам нужно добавить видеоконференцсвязь в реальном времени или совместное использование рабочего стола / документов в существующее приложение или службу, они предоставят API-интерфейсы и собственный интерфейс приложения. Delphi дает разработчикам возможность ориентироваться на все основные настольные и мобильные платформы наряду с производительностью собственного кода. Они легко смешивали код сборки в областях, где им нужна была максимальная производительность в Windows, macOS, iOS и Android. Платформа приветствует партнеров платформы интеграции и использования в соответствии с их сайтом. Говорят, являетесь ли вы педагогом, преподавателем, администратором университета, тренером по персоналу, корпоративным консультантом, обучающим агентством, корпоративным разработчиком или системным администратором и интегратором, Lumicademy создавалась с учетом ваших потребностей.
Tue Dec 29 2020 23:49:56 GMT+0700 (Western Indonesia Time)
Lumicademy é uma plataforma como serviço para fornecer uma experiência de sala de aula virtual em tempo real que os clientes podem adicionar aos seus produtos ou serviços existentes e é escrito em Delphi usando Firemonkey. De acordo com os desenvolvedores, se você precisar adicionar videoconferência ao vivo ou compartilhamento de desktop / documento ao seu aplicativo ou serviço existente, eles fornecem as APIs e a experiência de aplicativo nativa. O Delphi oferece aos desenvolvedores a capacidade de direcionar todas as principais plataformas de desktop e móveis junto com o desempenho do código nativo. Eles combinaram facilmente o código assembly em áreas onde desejavam o máximo desempenho no Windows, macOS, iOS e Android. A plataforma recebe parceiros de plataforma de uso de integração de acordo com seu site. Eles dizem que se você é um educador, professor, administrador de universidade, treinador de RH, consultor corporativo, agência de treinamento, desenvolvedor corporativo ou administrador de sistema e integrador, Lumicademy foi construído pensando em você.
Tue Dec 29 2020 23:49:16 GMT+0700 (Western Indonesia Time)
Lumicademy es una plataforma como servicio para proporcionar una experiencia de aula virtual en tiempo real que los clientes pueden agregar a su producto o servicio existente y está escrito en Delphi usando Firemonkey. Según los desarrolladores, si necesita agregar videoconferencias en vivo o compartir escritorio / documentos a su aplicación o servicio existente, ellos brindan las API y la experiencia de la aplicación nativa. Delphi brinda a los desarrolladores la capacidad de apuntar a todas las principales plataformas de escritorio y móviles junto con el rendimiento del código nativo. Combinaron fácilmente el código ensamblador en áreas donde querían el máximo rendimiento en Windows, macOS, iOS y Android. La plataforma da la bienvenida a los socios de la plataforma de uso de integración según su sitio. Dicen que si eres un educador, profesor, administrador universitario, capacitador de recursos humanos, consultor corporativo, agencia de capacitación, desarrollador corporativo o administrador e integrador de sistemas, Lumicademy se creó pensando en ti.
Tue Dec 29 2020 23:48:48 GMT+0700 (Western Indonesia Time)
Lumicademy ist eine Plattform-as-a-Service für die Bereitstellung eines virtuellen Klassenzimmers in Echtzeit, das Kunden zu ihrem bestehenden Produkt oder Dienst hinzufügen können, und es ist in Delphi mit Firemonkey geschrieben. Wenn Sie Live-Videokonferenzen oder Desktop-/Dokumentenfreigabe zu Ihrer bestehenden Anwendung oder Ihrem Dienst hinzufügen möchten, stellen sie laut den Entwicklern die APIs und das native App-Erlebnis zur Verfügung. Delphi gibt den Entwicklern die Möglichkeit, alle wichtigen Desktop- und Mobilplattformen zusammen mit der Leistung von nativem Code anzusprechen. Sie mischen einfach Assembler-Code in Bereichen, in denen sie maximale Leistung auf Windows, macOS, iOS und Android wünschen. Die Plattform begrüßt laut ihrer Website Partner für die Integration von Plattformen. Sie sagen, ob Sie ein Pädagoge, Lehrer, Universitätsadministrator, HR-Trainer, Unternehmensberater, Schulungsagentur, Unternehmensentwickler oder Systemadministrator und Integrator sind, Lumicademy wurde mit Ihnen im Sinn gebaut.
Tue Dec 29 2020 23:48:30 GMT+0700 (Western Indonesia Time)
Easy GIF Animator — это мощный редактор анимированных GIF от Blumentals Solutions SIA для создания анимированных изображений, баннеров, кнопок и видео в формате GIF, встроенный в Delphi. Интернет-мемы и анимированные гифки широко используются, и Easy GIF Animator — отличный инструмент, чтобы воспользоваться этой тенденцией. Благодаря мощным функциям, таким как возможность легко создавать GIF из видео с помощью мощного встроенного конвертера, изменять размер анимации GIF, обрезать анимацию GIF, обратную анимацию и автоматическую оптимизацию изображений GIF, Easy GIF Animator представляет собой гибкое решение для настольных ПК. Интерфейс чистый и простой в использовании. Утилиты Windows, такие как Easy GIF Animator, являются отличным примером того, как Delphi отлично подходит для создания мощных настольных приложений.
Tue Dec 29 2020 23:48:10 GMT+0700 (Western Indonesia Time)
Easy GIF Animator é um poderoso editor de GIFs animados da Blumentals Solutions SIA para a criação de imagens animadas, banners, botões e vídeos GIF e é construído em Delphi. Memes online e gifs animados são amplamente utilizados e o Easy GIF Animator é uma ótima ferramenta para tirar proveito dessa tendência. Com recursos poderosos como a capacidade de criar facilmente GIF a partir de vídeo usando um poderoso conversor embutido, redimensionar animações GIF, cortar animações GIF, animações reversas e otimização automática de imagens GIF, o Easy GIF Animator é uma solução flexível baseada em desktop. A interface é limpa e fácil de usar. Utilitários do Windows como o Easy GIF Animator são ótimos exemplos de onde o Delphi se destaca na construção de poderosos aplicativos de desktop.
Tue Dec 29 2020 23:47:30 GMT+0700 (Western Indonesia Time)
Easy GIF Animator es un poderoso editor de GIF animados de Blumentals Solutions SIA para crear imágenes animadas, pancartas, botones y videos GIF y está integrado en Delphi. Los memes en línea y los gifs animados disfrutan de un uso generalizado y Easy GIF Animator es una gran herramienta para aprovechar esa tendencia. Con características poderosas como la capacidad de crear fácilmente GIF a partir de video usando un poderoso convertidor incorporado, cambiar el tamaño de la animación GIF, recortar animaciones GIF, animaciones inversas y optimización automática de imágenes GIF, Easy GIF Animator es una solución flexible basada en escritorio. La interfaz es limpia y fácil de usar. Las utilidades de Windows como Easy GIF Animator son excelentes ejemplos de dónde destaca Delphi para crear potentes aplicaciones de escritorio.
Tue Dec 29 2020 23:46:50 GMT+0700 (Western Indonesia Time)
Easy GIF Animator ist ein leistungsfähiger animierter GIF-Editor von Blumentals Solutions SIA zur Erstellung von animierten Bildern, Bannern, Buttons und GIF-Videos und ist in Delphi aufgebaut. Online-Memes und animierte Gifs sind weit verbreitet und Easy GIF Animator ist ein großartiges Tool, um von diesem Trend zu profitieren. Mit leistungsstarken Funktionen wie der Möglichkeit, GIFs aus Videos mit Hilfe eines leistungsstarken eingebauten Konverters zu erstellen, GIF-Animationen in der Größe zu verändern, GIF-Animationen zu beschneiden, Animationen umzukehren und automatische GIF-Bildoptimierung ist Easy GIF Animator eine flexible Desktop-basierte Lösung. Die Oberfläche ist sauber und einfach zu bedienen. Windows-Hilfsprogramme wie Easy GIF Animator sind großartige Beispiele dafür, wie Delphi bei der Erstellung leistungsstarker Desktop-Anwendungen glänzt.
Tue Dec 29 2020 23:46:23 GMT+0700 (Western Indonesia Time)
Заголовок этого сообщения в блоге может сочетать в себе две слишком знакомые идеи, но он очень подходит для поставленных нами целей. Изучение и преподавание Delphi имеют первостепенное значение для нашего успеха, и мы планируем продолжать делать это в новом году. Обучение Delphi, конечно, помогает популяризировать продукты Embarcadero, но, что более важно, оно служит нашему сообществу и вашим клиентам. Delphi великолепен, и новые разработчики упускают его. По мере приближения Нового года мы думаем о наших самых важных усилиях на 2021 год, которые можно сгруппировать под двумя широкими заголовками: продукт и образование.
Продукт
В первую очередь, конечно же, продукт. Два важных релиза, возможно три, уже находятся в разработке. 10.4.2 обеспечит важные улучшения качества, завершив работу по обновлению LSP и затронув многие другие области производительности. У группы разработчиков также есть более творческие идеи, чтобы открыть среду IDE и упростить создание новых функций. Мы также думаем о том, как улучшить процесс адаптации и добавить в RAD Studio больше функций с низким уровнем кода. 10.5 обещает стать действительно хорошим выпуском (см. Дорожную карту на 2020 г.), и мы, возможно, также сможем незаметно внедрить выпуск 10.5.1. RAD Studio — огромный продукт, и мы понимаем, что не каждый выпуск затрагивает все области, которые нуждаются в улучшении, но команда неустанно и с большим энтузиазмом работает над продвижением продукта вперед. Мы также углубляем сотрудничество с нашими многочисленными технологическими партнерами, чтобы внести больше успехов в сообщество Delphi. Наша общая цель проста: позволить вам, разработчикам, легче создавать лучшие продукты.
Образование
Второе направление — образование. До присоединения к команде Embarcadero моя работа была сосредоточена на расширении возможностей получения образования на международном уровне. В то время как я работал в совершенно другой отрасли, цель была той же — использовать образование как стартовую площадку для учащихся. Это начинается с контента и перерастает в сообщество. Многое уже было достигнуто в этом направлении с помощью Embarcadero Academy, Bootcamps, LearnDelphi и других инициатив, но мы хотим сделать больше. Мы хотим, чтобы разработчики могли найти обучение Delphi на каждой платформе онлайн-обучения. Мы хотим, чтобы больше образовательных систем применяли Delphi в своих компьютерных программах. Нам нужны лучшие инструменты для самообучения, а также более легкое обучение в RAD Studio.
Мы хотим научить, как Delphi соотносится и может использоваться с другими языками, такими как Python (в наших первых вебинарах участвовало более 4К человек). Мы также хотим более тесных связей с сообществом открытого исходного кода, что является ключом к инновациям. Мы продолжим продвигать как коммерческие, так и некоммерческие проекты, которые помогают развивать нашу экосистему. Есть ряд новых интересных книг по Delphi, в том числе:
Мы разработали несколько образовательных пакетов, которые помогут начать Новый год. Пользователи C ++ Builder получат доступ к курсам по продвинутому C ++ и RAD Studio на английском и немецком языках. Разработчики Delphi получат доступ к двум онлайн-курсам на английском языке: одному по мобильной разработке, а другому по RAD Server. Некоторые из наших партнеров стремятся предлагать эти курсы и на местных языках.
Эти образовательные пакеты доступны бесплатно для подписчиков, которые приобрели лицензии до конца года, и предлагаются помимо всех доступных скидок.
Мы также хотим услышать ваше мнение о том, как нам следует улучшить нашу образовательную деятельность. Мы проводим множество опросов, чтобы узнать, чего хочет наша аудитория, но я рекомендую вам связаться со мной напрямую. Если вы хотите предложить урок или иметь представление о том, как его упаковать, или планируете выпустить видео на Youtube, о котором мы должны знать, дайте нам знать.
2020 год был тяжелым годом для мира, но мы полны решимости приветствовать 2021 год на высокой ноте. Вот почему мы предлагаем огромную скидку 20 + 20 в конце года на все продукты. Нажмите здесь, чтобы воспользоваться единовременной скидкой 40% и начать работу в 2021 году!
Бонусное предложение: для тех из вас, кто еще не продлил поддержку и обслуживание, мы также предлагаем скидки на конец года. Свяжитесь с нашей командой по продлению, чтобы узнать, на что вы претендуете!
Tue Dec 29 2020 23:45:41 GMT+0700 (Western Indonesia Time)
O título desta postagem do blog pode combinar duas ideias um tanto familiares demais, mas é altamente apropriado para os objetivos que estabelecemos. Aprender e ensinar Delphi é fundamental para nosso sucesso, e planejamos continuar fazendo isso no ano novo. A educação da Delphi ajuda a popularizar os produtos da Embarcadero, é claro, mas o mais importante, ela atende à nossa comunidade e aos seus clientes. Delphi é incrível, e novos desenvolvedores estão perdendo. À medida que nos aproximamos do Ano Novo, pensamos em nossos esforços mais importantes para 2021, que podem ser agrupados em dois grandes títulos: Produto e Educação.
produtos
A área de enfoque número um, é claro, é o produto. Dois lançamentos importantes, provavelmente três, já estão em andamento. 10.4.2 fornecerá melhorias de qualidade importantes, completando o esforço de atualização do LSP e abordando muitas outras áreas de produtividade. A equipe de produto também tem ideias mais criativas para abrir o IDE e tornar mais fácil a construção de novos recursos. Também estamos pensando em como melhorar ainda mais a integração e trazer mais recursos de baixo código para o RAD Studio. 10.5 está se preparando para ser um lançamento muito bom (veja o roteiro de 2020), e podemos introduzir uma versão 10.5.1 também. RAD Studio é um produto enorme e percebemos que nem todo lançamento afeta todas as áreas que precisam de melhorias, mas a equipe está trabalhando incansavelmente e com grande entusiasmo para fazer o produto avançar. Também estamos aprofundando a colaboração com nossos muitos parceiros de tecnologia para trazer mais avanços para a comunidade Delphi. Nosso objetivo comum é simples: permitir que vocês, desenvolvedores, criem produtos melhores com mais facilidade.
Educação
The second area of focus is Education. Prior to joining the Embarcadero team, my work was centered around expanding educational opportunities internationally. While I was in a much different industry the goal was the same, to use education as a launchpad for learners. This starts with content and builds into the community. Much has already been achieved in this direction with Embarcadero Academy, Bootcamps, LearnDelphi, and other initiatives, but we want to do more. We want to ensure developers can find Delphi education on every online training platform. We want more education systems to adopt Delphi for their computer curriculums. We want better self-learning tools, but also easier learning within RAD Studio.
Queremos ensinar como o Delphi se relaciona e pode ser usado com outras linguagens, como Python (tivemos mais de 4 K pessoas participando de nossos Webinars iniciais). Também queremos conexões mais fortes com a comunidade Open Source, que é a chave para a inovação. Continuaremos a promover projetos comerciais e não comerciais que ajudem a aumentar nosso ecossistema. Existem vários novos livros interessantes para a Delphi, incluindo:
Desenvolvemos vários pacotes educacionais para ajudar a iniciar o ano novo. Os usuários do C ++ Builder terão acesso a cursos em C ++ avançado e RAD Studio em inglês e alemão. Os desenvolvedores Delphi terão acesso a dois cursos online em inglês, um sobre desenvolvimento mobile e outro sobre RAD Server. Alguns de nossos parceiros estão empenhados em oferecer esses cursos também nos idiomas locais.
Esses pacotes educacionais estão disponíveis gratuitamente para assinantes que compram licenças antes do final do ano e são oferecidos além de todos os descontos disponíveis.
Também queremos ouvir sua opinião sobre como devemos melhorar nossos esforços de educação. Fazemos muitas pesquisas para descobrir o que nosso público deseja, mas encorajo você a entrar em contato comigo diretamente. Se você gostaria de oferecer uma aula ou tem uma idéia de como empacotar uma, ou está planejando lançar um vídeo do Youtube que devemos conhecer, nos avise.
2020 tem sido um ano difícil para o mundo, mas estamos determinados em dar as boas-vindas a 2021 com uma nota alta. É por isso que estamos oferecendo um grande desconto especial de final de ano de 20 + 20 em todos os produtos. Clique aqui para aproveitar este desconto único de 40% e comece a correr em 2021!
Oferta Bônus: Para aqueles que ainda não renovaram o suporte e a manutenção, também oferecemos descontos no fechamento do ano. Entre em contato com nossa equipe de renovações diretamente para ver o que você se qualifica!
Tue Dec 29 2020 23:44:58 GMT+0700 (Western Indonesia Time)
El título de esta publicación de blog puede combinar dos ideas demasiado familiares, pero es muy apropiado para los objetivos que nos hemos fijado. Aprender y enseñar Delphi es primordial para nuestro éxito y planeamos seguir haciéndolo en el Año Nuevo. La educación de Delphi ayuda a popularizar los productos Embarcadero, por supuesto, pero lo más importante es que sirve a nuestra comunidad y a sus clientes. Delphi es increíble y los nuevos desarrolladores se lo están perdiendo. A medida que nos acercamos al Año Nuevo, pensamos en nuestros esfuerzos más importantes para 2021, que se pueden agrupar en dos grandes títulos: Producto y Educación.
Producto
El área de enfoque número uno, por supuesto, es Producto. Dos lanzamientos importantes, probablemente tres, ya están en proceso. 10.4.2 proporcionará importantes mejoras de calidad, completando el esfuerzo de actualización de LSP y abordando muchas otras áreas de productividad. El equipo de producto también tiene ideas más creativas para abrir el IDE y facilitar la creación de nuevas funciones. También estamos pensando en cómo mejorar aún más la incorporación y traer más funciones de código bajo a RAD Studio. 10.5 se perfila como una versión realmente agradable (consulte la hoja de ruta 2020), y es posible que también podamos introducir una versión 10.5.1. RAD Studio es un producto enorme y nos damos cuenta de que no todas las versiones afectan todas las áreas que necesitan mejoras, pero el equipo está trabajando incansablemente y con gran entusiasmo para hacer avanzar el producto. También estamos profundizando la colaboración con nuestros numerosos socios tecnológicos para aportar más avances a la comunidad de Delphi. Nuestro objetivo compartido es simple: permitirles a ustedes, los desarrolladores, crear mejores productos con mayor facilidad.
Educación
The second area of focus is Education. Prior to joining the Embarcadero team, my work was centered around expanding educational opportunities internationally. While I was in a much different industry the goal was the same, to use education as a launchpad for learners. This starts with content and builds into the community. Much has already been achieved in this direction with Embarcadero Academy, Bootcamps, LearnDelphi, and other initiatives, but we want to do more. We want to ensure developers can find Delphi education on every online training platform. We want more education systems to adopt Delphi for their computer curriculums. We want better self-learning tools, but also easier learning within RAD Studio.
Queremos enseñar cómo Delphi se relaciona y se puede usar con otros lenguajes como Python (tuvimos más de 4K personas que participaron en nuestros seminarios web iniciales). También queremos conexiones más sólidas con la comunidad de código abierto, que es clave para la innovación. Continuaremos promoviendo proyectos comerciales y no comerciales que ayuden a hacer crecer nuestro ecosistema. Hay una serie de libros nuevos e interesantes para Delphi, que incluyen:
Hemos desarrollado varios paquetes educativos para ayudar a dar inicio al Año Nuevo. Los usuarios de C ++ Builder tendrán acceso a cursos de C ++ avanzado y RAD Studio en inglés y alemán. Los desarrolladores de Delphi tendrán acceso a dos cursos en línea en inglés, uno sobre desarrollo móvil y otro sobre RAD Server. Algunos de nuestros socios se han comprometido a ofrecer estos cursos también en los idiomas locales.
Estos paquetes educativos están disponibles de forma gratuita para los suscriptores que adquieran licencias antes de fin de año y se ofrecen además de todos los descuentos disponibles.
También queremos escuchar sus opiniones sobre cómo deberíamos mejorar nuestros esfuerzos educativos. Hacemos muchas encuestas para descubrir lo que quiere nuestra audiencia, pero le animo a que se comunique conmigo directamente. Si desea ofrecer una clase o tiene una idea sobre cómo empaquetar una, o planea lanzar un video de Youtube que deberíamos conocer, háganoslo saber.
2020 ha sido un año difícil para el mundo, pero estamos decididos a dar la bienvenida a 2021 con una nota alta. Es por eso que ofrecemos un enorme descuento especial de fin de año de 20 + 20 en todos los productos. ¡Haga clic aquí para aprovechar este descuento único del 40% y empezar a trabajar en 2021!
Oferta de bonificación: para aquellos de ustedes que aún no hayan renovado su soporte y mantenimiento, también ofrecemos descuentos para cerrar el año. Póngase en contacto con nuestro equipo de renovaciones directamente para ver para qué califica.
Tue Dec 29 2020 23:44:07 GMT+0700 (Western Indonesia Time)
Der Titel dieses Blog-Beitrags mag zwei etwas zu vertraute Begriffe vereinen, aber er ist sehr passend für die Ziele, die wir uns gesetzt haben. Das Lernen und Lehren von Delphi ist für unseren Erfolg von größter Bedeutung, und wir planen, im neuen Jahr mehr davon zu tun. Delphi-Schulungen helfen natürlich, Embarcadero-Produkte populär zu machen, aber noch wichtiger ist, dass sie unserer Community und Ihren Kunden dienen. Delphi ist großartig, und neue Entwickler verpassen es. Während wir uns dem neuen Jahr nähern, denken wir über unsere wichtigsten Bemühungen für 2021 nach, die unter zwei großen Überschriften gruppiert werden können: Produkt und Bildung.
Produkt
Der Schwerpunkt Nummer eins ist natürlich das Produkt. Zwei wichtige Versionen, wahrscheinlich drei, sind bereits in Arbeit. 10.4.2 wird wichtige Qualitätsverbesserungen bringen, das LSP-Upgrade abschließen und viele andere Produktivitätsbereiche ansprechen. Das Produktteam hat auch weitere kreative Ideen, um die IDE zu öffnen und die Erstellung neuer Funktionen zu erleichtern. Wir denken auch darüber nach, wie wir das Onboarding weiter verbessern und mehr Low-Code-Funktionen in RAD Studio einbringen können. 10.5 entwickelt sich zu einem wirklich schönen Release (siehe Roadmap 2020), und vielleicht können wir auch noch ein 10.5.1-Release einschieben. RAD Studio ist ein riesiges Produkt, und uns ist klar, dass nicht jedes Release alle Bereiche betrifft, die verbessert werden müssen, aber das Team arbeitet unermüdlich und mit erhöhtem Enthusiasmus daran, das Produkt voranzubringen. Wir vertiefen auch die Zusammenarbeit mit unseren vielen Technologiepartnern, um der Delphi-Community weitere Fortschritte zu ermöglichen. Unser gemeinsames Ziel ist einfach: Ihnen, den Entwicklern, die Möglichkeit zu geben, bessere Produkte einfacher zu erstellen.
Bildung
Der zweite Schwerpunktbereich ist die Ausbildung. Bevor ich dem Embarcadero-Team beitrat, konzentrierte sich meine Arbeit auf die Erweiterung von Bildungsmöglichkeiten auf internationaler Ebene. Obwohl ich in einer ganz anderen Branche tätig war, war das Ziel dasselbe: Bildung als Startrampe für Lernende zu nutzen. Das fängt bei den Inhalten an und baut sich in der Community auf. Mit der Embarcadero Academy, Bootcamps, LearnDelphi und anderen Initiativen wurde bereits viel in dieser Richtung erreicht, aber wir wollen noch mehr tun. Wir möchten sicherstellen, dass Entwickler Delphi-Schulungen auf jeder Online-Schulungsplattform finden können. Wir wollen, dass mehr Bildungssysteme Delphi in ihre Computer-Lehrpläne aufnehmen. Wir wollen bessere Selbstlernwerkzeuge, aber auch einfacheres Lernen innerhalb von RAD Studio.
Wir wollen lehren, wie Delphi mit anderen Sprachen wie Python zusammenhängt und verwendet werden kann (an unseren ersten Webinaren haben über 4K Personen teilgenommen). Wir wollen auch eine stärkere Verbindung mit der Open-Source-Community, die der Schlüssel zur Innovation ist. Wir werden weiterhin sowohl kommerzielle als auch nicht-kommerzielle Projekte fördern, die zum Wachstum unseres Ökosystems beitragen. Es gibt eine Reihe von spannenden neuen Büchern für Delphi, darunter:
Die aktualisierte Version von Marco Cantùs Object Pascal Handbook für 10.4 Sydney . Erfahren Sie mehr über all diese großartigen neuen Sprachfunktionen!
Wir haben verschiedene Bildungspakete entwickelt, um das neue Jahr zu beginnen. Benutzer von C ++ Builder erhalten Zugriff auf Kurse in fortgeschrittenem C ++ und RAD Studio in Englisch und Deutsch. Delphi-Entwickler erhalten Zugriff auf zwei Online-Kurse in Englisch, einen zur mobilen Entwicklung und einen zum RAD-Server. Einige unserer Partner sind bestrebt, diese Kurse auch in lokalen Sprachen anzubieten.
Diese Schulungspakete sind für Abonnenten, die vor Jahresende Lizenzen erwerben, kostenlos erhältlich und werden zusätzlich zu allen verfügbaren Rabatten angeboten.
Wir möchten auch Ihre Ansichten darüber hören, wie wir unsere Bildungsbemühungen verbessern sollten. Wir führen viele Umfragen durch, um herauszufinden, was unser Publikum will, aber ich ermutige Sie, sich direkt an mich zu wenden. Wenn Sie einen Kurs anbieten möchten oder eine Idee zum Verpacken eines Kurses haben oder ein Youtube-Video veröffentlichen möchten, über das wir Bescheid wissen sollten, lassen Sie es uns wissen.
2020 war ein hartes Jahr für die Welt, aber wir sind fest entschlossen, 2021 auf einem hohen Niveau zu begrüßen. Aus diesem Grund bieten wir einen riesigen Rabatt von 20 + 20 zum Jahresende auf alle Produkte. Klicken Sie hier , um diesen einmaligen Rabatt von 40% zu nutzen und 2021 loszulegen!
Bonusangebot: Für diejenigen unter Ihnen, die Ihren Support und Ihre Wartung noch nicht erneuert haben, bieten wir auch Rabatte zum Jahresende an. Wenden Sie sich direkt an unser Erneuerungsteam, um zu erfahren, wofür Sie sich qualifizieren!
Fri Dec 25 2020 00:02:36 GMT+0700 (Western Indonesia Time)
Screensaver Factory — это профессиональная программа для создания заставок с неограниченным коммерческим распространением без лицензионных отчислений, построенная на Delphi. Среди своих многочисленных клиентов они включают Microsoft, Pfizer, EPSON, Verizon, AutoDesk, HSBC, Sony и Motorola, а также тысячи малых предприятий. Согласно их веб-сайту, это самое продвинутое программное обеспечение в своем роде, очень простое в использовании, плюс оно позволяет вам создавать файлы заставок и компакт-диски для самостоятельной установки для легкой установки и распространения. Он имеет расширенные эффекты перехода, возможность создания системы лицензирования для создаваемых вами заставок и даже режим RSS-канала, который может загружать и отображать RSS-канал на заставке. Это отличный пример того, как разработчик использует Delphi для создания профессионального программного продукта.
Fri Dec 25 2020 00:02:14 GMT+0700 (Western Indonesia Time)
O Screensaver Factory é um software profissional de geração de protetores de tela com distribuição comercial ilimitada e livre de royalties e é construído em Delphi. Eles listam Microsoft, Pfizer, EPSON, Verizon, AutoDesk, HSBC, Sony e Motorola, além de milhares de empresas menores entre seus muitos clientes. De acordo com o site deles, é o software mais avançado do gênero e muito fácil de usar, além de permitir que você crie arquivos de proteção de tela e CDs de instalação automática para fácil configuração e distribuição. Possui efeitos de transição avançados, a capacidade de criar um sistema de licenciamento para os protetores de tela que você cria e até mesmo um modo de feed RSS que pode carregar e exibir um feed RSS no protetor de tela. Este é um ótimo exemplo de um desenvolvedor usando Delphi para construir um produto de software profissional que entrega.
Fri Dec 25 2020 00:01:40 GMT+0700 (Western Indonesia Time)
Screensaver Factory es un software de generación de salvapantallas profesional con distribución comercial ilimitada y libre de regalías y está construido en Delphi. Incluyen Microsoft, Pfizer, EPSON, Verizon, AutoDesk, HSBC, Sony y Motorola, además de miles de pequeñas empresas entre sus muchos clientes. Según su sitio web, es el software más avanzado de su tipo y es muy fácil de usar, además de que le permite crear archivos de salvapantallas y CD de autoinstalación para una fácil instalación y distribución. Cuenta con efectos de transición avanzados, la capacidad de crear un sistema de licencias para los protectores de pantalla que crea e incluso un modo de fuente RSS que puede cargar y mostrar una fuente RSS en el protector de pantalla. Este es un gran ejemplo de un desarrollador que usa Delphi para crear un producto de software profesional que cumple.
Fri Dec 25 2020 00:01:19 GMT+0700 (Western Indonesia Time)
Screensaver Factory ist eine professionelle Software zur Erzeugung von Bildschirmschonern mit unbegrenzter lizenzfreier kommerzieller Verbreitung und wurde in Delphi entwickelt. Zu den zahlreichen Kunden gehören Microsoft, Pfizer, EPSON, Verizon, AutoDesk, HSBC, Sony und Motorola sowie Tausende kleinerer Unternehmen. Laut ihrer Website handelt es sich um die fortschrittlichste Software ihrer Art, die sehr einfach zu bedienen ist und es Ihnen ermöglicht, selbstinstallierende Bildschirmschonerdateien und -CDs für eine einfache Einrichtung und Verteilung zu erstellen. Es bietet fortschrittliche Übergangseffekte, die Möglichkeit, ein Lizenzsystem für die von Ihnen erstellten Bildschirmschoner zu erstellen, und sogar einen RSS-Feed-Modus, der einen RSS-Feed auf den Bildschirmschoner laden und anzeigen kann. Dies ist ein großartiges Beispiel für einen Entwickler, der Delphi verwendet, um ein professionelles Softwareprodukt zu erstellen, das überzeugt.
Thu Dec 24 2020 23:59:52 GMT+0700 (Western Indonesia Time)
Chess Openings Wizard es una herramienta para macOS, Windows, iPad y Android que reduce drásticamente el tiempo que lleva diseñar y memorizar una apertura y está integrado en Delphi. Las versiones multiplataforma utilizan FireMonkey para ahorrar tiempo de desarrollo. Los grandes maestros y los novatos pueden trazar sus vacantes y comparar sus planes con los mejores jugadores y oponentes informáticos increíblemente fuertes. Según el desarrollador, “si estás diseñando una apertura con una aplicación de base de datos de juegos o con un programa de juego, estás trabajando demasiado. Chess Openings Wizard contiene 34 años de mejoras, con precisamente las herramientas que un jugador serio de torneos necesita para prepare las aperturas rápidamente. Chess Openings Wizard es una aplicación móvil complementaria para el mismo programa en Windows y Macintosh “. Con él puedes mover tu repertorio de aperturas a tu dispositivo (Android y iPad) y prepararte en cualquier lugar. Obtenga más información en el blog de video.
Thu Dec 24 2020 23:59:32 GMT+0700 (Western Indonesia Time)
Chess Openings Wizard ist ein Tool für macOS, Windows, iPad und Android, das die Zeit für den Entwurf und das Auswendiglernen einer Eröffnung drastisch reduziert und in Delphi entwickelt wurde. Die plattformübergreifenden Versionen nutzen FireMonkey, um Entwicklungszeit zu sparen. Großmeister und Neulinge können ihre Eröffnungen entwerfen und ihre Pläne mit den besten Spielern und unglaublich starken Computergegnern vergleichen. Laut dem Entwickler „wenn Sie eine Eröffnung entweder mit einer Spieldatenbank-App oder mit einem Spielprogramm entwerfen, arbeiten Sie zu hart. Chess Openings Wizard enthält 34 Jahre an Verfeinerungen, mit genau den Werkzeugen, die ein ernsthafter Turnierspieler benötigt, um Eröffnungen schnell vorzubereiten. Chess Openings Wizard ist eine mobile Begleit-App für das gleiche Programm auf Windows und Macintosh.“ Mit ihr können Sie Ihr Eröffnungsrepertoire auf Ihr Gerät (Android und iPad) übertragen und sich überall vorbereiten. Erfahren Sie mehr im Video-Blog.
このウィンドウには、プロセス全体に関する情報が表示されます。プロセスレベルの CPU 使用率 (再びカーネルとユーザモードに分かれています)、プロセスの種類 (例:Wow64)、および実行/一時停止/リセットなどのボタンが表示されます。これらはプロセスレベルのもので、IDE独自の実行ツールバーと同じ機能を提供します。
CPU 使用率は、ローカル (非リモートデバッグ) の Windows アプリケーションでのみサポートされています。スレッド単位でのステッピングや実行は、スレッドフリーズをサポートしているプラットフォームでのみ機能します。C++ Win64 では、コール スタックを評価できないという既知の問題(RSP-29768)があります。この問題は、今後リリースされるC++Builderの後継バージョンで修正される予定です。
Thu Dec 24 2020 00:19:33 GMT+0700 (Western Indonesia Time)
Два популярных бесплатных дополнения IDE для навигации по коду теперь доступны для версии 10.4.
В 10.3.1 мы начали поставки двух популярных плагинов IDE, предназначенных для навигации по коду. Закладки заменяют закладки редактора IDE неограниченным количеством маркеров, новыми маркерами каретки (навигационной цепочкой), защитой от случайной перезаписи, закрепляемым окном с контекстной информацией о каждой закладке и т. Д. Navigator добавляет в редактор миникарту (альтернатива полосы прокрутки, показывающая предварительный просмотр кода) и окно Go To, которое позволяет быстро переходить к любой полезной части вашего устройства с помощью клавиатуры, будь то метод, объявление класса или свойство. или даже функция реализации свойства.
Вы можете узнать больше о закладках и навигаторе , включая все функции повышения производительности.
Эти два плагина теперь доступны для RAD Studio 10.4 в GetIt (см. Раздел IDE Plugins слева). Важно отметить, что они также обновлены для последних функций языка Delphi, включая встроенные переменные.
Thu Dec 24 2020 00:00:55 GMT+0700 (Western Indonesia Time)
Мастер шахматных дебютов — это инструмент для macOS, Windows, iPad и Android, который значительно сокращает время, необходимое для разработки и запоминания дебюта, и он встроен в Delphi. Кроссплатформенные версии используют FireMonkey для экономии времени разработки. Гроссмейстеры и новички могут наметить свои дебюты и сравнить свои планы с лучшими игроками и невероятно сильными компьютерными оппонентами. По словам разработчика, «если вы создаете дебют с помощью приложения игровой базы данных или игровой программы, вы слишком много работаете. Мастер шахматных дебютов содержит 34 года доработок, с инструментами, которые необходимы серьезному турнирному игроку готовьте дебюты быстро. Chess Openings Wizard — мобильное приложение-компаньон для той же программы для Windows и Macintosh ». С его помощью вы можете перенести свой вступительный репертуар на свое устройство (Android и iPad) и подготовиться где угодно. Узнайте больше в видеоблоге.
Thu Dec 24 2020 00:00:37 GMT+0700 (Western Indonesia Time)
Chess Openings Wizard é uma ferramenta para macOS, Windows, iPad e Android que reduz drasticamente o tempo que leva para projetar e memorizar uma abertura e é construído em Delphi. As versões de plataforma cruzada utilizam FireMonkey para economizar tempo de desenvolvimento. Grandes mestres e novatos podem mapear suas aberturas e comparar seus planos com os dos melhores jogadores e oponentes de computador incrivelmente fortes. De acordo com o desenvolvedor, “se você está projetando uma abertura com um aplicativo de banco de dados de jogo ou com um programa de jogo, está trabalhando muito. O Chess Openings Wizard contém 34 anos de refinamentos, com precisamente as ferramentas que um jogador de torneio sério precisa para prepare aberturas rapidamente. Chess Openings Wizard é um aplicativo móvel complementar para o mesmo programa no Windows e no Macintosh. ” Com ele você pode mover seu repertório de abertura para o seu dispositivo (Android e iPad) e preparar em qualquer lugar. Descubra mais no blog de vídeo.
Wed Dec 23 2020 23:59:10 GMT+0700 (Western Indonesia Time)
Rapid SEO Tool от Blumentals Solutions SIA — это программное обеспечение для поисковой оптимизации и мониторинга позиции в поисковых системах для настольных компьютеров, встроенное в Delphi. Согласно их сайту, «он призван облегчить задачу улучшения позиции веб-страницы в результатах поиска. Он будет буквально смотреть на код вашей веб-страницы и предлагать, что можно улучшить, чтобы получить лучшие результаты». Программное обеспечение предлагает некоторые интересные функции, и это приятное изменение темпа, поскольку это единственная фиксированная плата по сравнению с подпиской. Многие онлайн-сервисы SEO взимают повторяющуюся плату. Программное обеспечение визуально привлекательно и, похоже, широко использует элементы управления на основе браузера, чтобы обеспечить красивый интерфейс. Некоторые из перечисленных в нем функций включают автоматические предложения, параллельное сравнение, проверку содержимого, мониторинг позиции, проверку производительности, просмотр паука поиска, бесплатную книгу / руководство по SEO, анализ плотности ключевых слов и отчетность.
Wed Dec 23 2020 23:58:50 GMT+0700 (Western Indonesia Time)
Rapid SEO Tool da Blumentals Solutions SIA é um software de otimização de mecanismo de pesquisa e monitoramento de posição de mecanismo de pesquisa para desktop que é construído em Delphi. De acordo com o site, “ele foi projetado para facilitar a tarefa de melhorar a posição da página da web nos resultados de pesquisa. Ele literalmente examinará o código da página da web e sugerirá o que pode ser melhorado para obter melhores resultados“. O software oferece alguns recursos interessantes e é uma boa mudança de ritmo é que é uma única taxa fixa versus uma assinatura. Muitos serviços de SEO online cobram uma taxa recorrente. O software é visualmente atraente e parece usar um controle baseado em navegador extensivamente para fornecer uma interface de boa aparência. Alguns dos recursos que ele lista incluem sugestões automáticas, comparação lado a lado, verificação de conteúdo, monitoramento de posição, verificação de desempenho, exibição de pesquisa de aranha, livro / guia de SEO gratuito, análise de densidade de palavras-chave e relatórios.
Wed Dec 23 2020 23:57:52 GMT+0700 (Western Indonesia Time)
Rapid SEO Tool de Blumentals Solutions SIA es un software de optimización de motores de búsqueda y monitoreo de posición de motores de búsqueda para el escritorio que está integrado en Delphi. Según su sitio, “se diseñó para facilitar la tarea de mejorar la posición de la página web en los resultados de búsqueda. Literalmente examinará el código de su página web y sugerirá qué se puede mejorar para obtener mejores resultados“. El software ofrece algunas características interesantes y un buen cambio de ritmo es que se trata de una tarifa plana única frente a una suscripción. Muchos servicios de SEO en línea cobran una tarifa recurrente. El software es visualmente atractivo y parece utilizar un control basado en navegador ampliamente para proporcionar una interfaz de aspecto agradable. Algunas de las características que enumera incluyen sugerencias automáticas, comparación lado a lado, verificación de contenido, monitoreo de posición, verificación de rendimiento, vista de araña de búsqueda, libro / guía de SEO gratuito, análisis de densidad de palabras clave e informes.
Wed Dec 23 2020 23:57:26 GMT+0700 (Western Indonesia Time)
Rapid SEO Tool von Blumentals Solutions SIA ist eine Software zur Suchmaschinenoptimierung und Überwachung der Suchmaschinenposition für den Desktop, die in Delphi erstellt wurde. Laut ihrer Website „wurde es entwickelt, um die Aufgabe der Verbesserung der Webseitenposition in den Suchergebnissen zu erleichtern. Es schaut sich buchstäblich Ihren Webseitencode an und schlägt vor, was verbessert werden kann, um bessere Ergebnisse zu erzielen.“ Die Software bietet einige interessante Funktionen und eine nette Abwechslung ist, dass es eine einmalige Pauschalgebühr im Gegensatz zu einem Abonnement ist. Viele SEO-Dienste im Internet verlangen eine wiederkehrende Gebühr. Die Software ist optisch ansprechend und scheint weitgehend eine browserbasierte Steuerung zu verwenden, um die schön aussehende Oberfläche zu bieten. Einige der aufgelisteten Funktionen sind automatische Vorschläge, Side-by-Side-Vergleich, Inhaltskontrolle, Positionsüberwachung, Leistungsüberprüfung, Suchspinnen-Ansicht, kostenloses SEO-Buch / Leitfaden, Keyword-Dichte-Analyse und Reporting.
Wed Dec 23 2020 23:56:48 GMT+0700 (Western Indonesia Time)
Как раз к Рождеству мы выполняем свое обещание и представляем вам новый технический документ — Разработка ЛУЧШЕЙ среды разработки с помощью сравнительного анализа . В этом документе исследуются три платформы — Delphi , Windows Presentation Foundation (WPF) с .NET Framework и Electron — с использованием 23-метрической взвешенной оценки, чтобы определить, какая из них обеспечивает лучшую продуктивность разработчика , бизнес- функциональность , гибкость приложений и производительность продукта . Этот первый раунд выбрал клон калькулятора Windows 10 в качестве эталона для проверки способности каждой платформы воссоздавать известный графический интерфейс и ориентироваться на среду рабочего стола Windows.
Рисунок 1 — Схема оценочной взвешенной оценки
Наши результаты, вероятно, неудивительны для разработчиков Delphi — Delphi VCL и FMX взорвали конкуренцию, набрав 4,66 балла из 5. Electron был на втором месте с 3,11 баллами, а WPF занял последнее место. Помимо оценок, качественный и количественный анализ позволяет сделать несколько выводов:
Delphi и его среда разработки RAD Studio значительно повышают продуктивность разработки и ускоряют вывод продукта на рынок. Мало того, разработка единой базы кода для всех настольных и мобильных платформ упрощает последующие выпуски и сопровождение продукта.
WPF с .NET Framework предлагает небольшим группам собственный доступ к приложениям Windows и надежную среду IDE, но изо всех сил пытается соответствовать продуктивности, безопасности IP и производительности Delphi, а также отсутствуют кроссплатформенные функции Delphi и Electron.
Electron предлагает бесплатную альтернативу Delphi и WPF, знакомство с интерфейсными разработчиками и кросс-платформенные возможности за счет защиты IP, стандартных инструментов IDE и производительности приложений.
Рисунок 2 — Сравнение Delphi, WPF и Electron по 4 категориям
Эта статья предназначена для начала разговора! Полный исходный код этого проекта доступен на GitHub, чтобы вы могли его изучить и улучшить. Прочтите статью, напишите в ответ сообщение в блоге или попробуйте приложение-калькулятор получше и отправьте запрос на перенос на GitHub, чтобы мы могли добавить его в репозиторий. Нашли ошибку? Задайте вопрос, чтобы мы могли улучшить этот проект и собрать лучшие практики и методы для каждой платформы. Никто из нас не так умен, как все!
Wed Dec 23 2020 23:56:30 GMT+0700 (Western Indonesia Time)
Bem a tempo para o Natal, estamos cumprindo nossa promessa de apresentar a você um novo white paper – Developing the BEST Developer Framework through Benchmarking . Este artigo examina três estruturas – Delphi , Windows Presentation Foundation (WPF) com .NET Framework e Electron – usando uma avaliação ponderada de 23 métricas para determinar qual oferece a melhor produtividade do desenvolvedor , funcionalidade de negócios , flexibilidade de aplicativo e desempenho do produto . Esta primeira rodada escolheu um clone de calculadora do Windows 10 como referência para examinar a capacidade de cada estrutura de recriar uma GUI conhecida e direcionar o ambiente de área de trabalho do Windows.
Figura 1 – Esquema de avaliação com pontuação e peso
Nossos resultados provavelmente não surpreendem os desenvolvedores Delphi – Delphi VCL e FMX tiraram a competição da água, marcando 4,66 pontos em 5. Electron estava em um distante segundo lugar com 3,11 pontos e WPF ficou em último lugar. Pontuações à parte, a análise qualitativa e quantitativa fornece algumas conclusões:
Delphi e seu RAD Studio IDE aumentam profundamente a produtividade do desenvolvimento e o tempo de lançamento do produto no mercado. Além disso, desenvolver uma base de código para alcançar todas as plataformas móveis e de desktop simplifica lançamentos sucessivos e manutenção de produtos.
O WPF com o .NET Framework oferece a pequenas equipes entrada nativa para aplicativos do Windows e um IDE sólido, mas se esforça para corresponder à produtividade, segurança IP e desempenho do Delphi, ao mesmo tempo em que falta os recursos de plataforma cruzada do Delphi e Electron.
Electron oferece uma alternativa gratuita para Delphi e WPF, familiaridade para desenvolvedores front-end e capacidade de plataforma cruzada ao custo de proteção IP, ferramentas IDE padrão e desempenho de aplicativo.
Figura 2 – Comparação Delphi, WPF e de elétrons de 4 categorias
Este artigo foi feito para iniciar uma conversa! Todo o código-fonte deste projeto está disponível no GitHub para você examinar e melhorar. Leia o artigo, escreva uma postagem no blog em resposta ou um aplicativo de calculadora melhor e envie uma solicitação de pull do GitHub para que possamos adicioná-la ao repositório. Encontrou um erro? Envie um problema para que possamos melhorar este projeto e coletar as melhores práticas e técnicas para cada estrutura. Nenhum de nós é tão inteligente quanto todos nós!
Wed Dec 23 2020 23:55:55 GMT+0700 (Western Indonesia Time)
Justo a tiempo para Navidad, estamos cumpliendo nuestra promesa de presentarles un nuevo informe técnico : Desarrollo del MEJOR marco para desarrolladores a través de la evaluación comparativa . Este documento examina tres marcos: Delphi , Windows Presentation Foundation (WPF) con .NET Framework y Electron , utilizando una evaluación ponderada de 23 métricas para determinar cuál ofrece la mejor productividad para el desarrollador , funcionalidad comercial , flexibilidad de aplicaciones y rendimiento del producto . Esta primera ronda eligió un clon de la calculadora de Windows 10 como punto de referencia para examinar la capacidad de cada marco para recrear una GUI conocida y apuntar al entorno de escritorio de Windows.
Figura 1 – Esquema de evaluación ponderado puntuado
Nuestros resultados probablemente no sorprenden a los desarrolladores de Delphi: Delphi VCL y FMX sacaron a la competencia del agua, anotando 4.66 puntos de 5. Electron quedó en un distante segundo lugar con 3.11 puntos y WPF ocupó el último lugar. Dejando a un lado las puntuaciones, el análisis cualitativo y cuantitativo proporciona algunas conclusiones:
Delphi y su RAD Studio IDE mejoran profundamente la productividad del desarrollo y el tiempo de comercialización del producto. No solo eso, desarrollar una base de código para llegar a todas las plataformas de escritorio y móviles simplifica las versiones sucesivas y el mantenimiento del producto.
WPF con .NET Framework ofrece a los pequeños equipos una entrada nativa a las aplicaciones de Windows y un IDE sólido, pero tiene dificultades para igualar la productividad, la seguridad IP y el rendimiento de Delphi, mientras que también le faltan las funciones multiplataforma de Delphi y Electron.
Electron ofrece una alternativa gratuita a Delphi y WPF, familiaridad para los desarrolladores front-end y capacidad multiplataforma a costa de la protección IP, las herramientas IDE estándar y el rendimiento de la aplicación.
Figura 2 – Comparación de Delphi, WPF y Electrones de 4 categorías
Puede descargar este documento de forma gratuita visitando lp.embarcadero.com/Discovering_the_best_framework , ingresando su dirección de correo electrónico y siguiendo un enlace enviado a su bandeja de entrada.
Comentarios de la comunidad
¡Este documento está destinado a iniciar una conversación! El código fuente completo de este proyecto está disponible en GitHub para que lo examine y mejore. Lea el documento, escriba una publicación de blog en respuesta o una mejor aplicación de calculadora, y envíe una solicitud de extracción de GitHub para que podamos agregarla al repositorio. ¿Encontraste un error? Envíe un problema para que podamos mejorar este proyecto y recopilar las mejores prácticas y técnicas para cada marco. ¡Ninguno de nosotros es tan inteligente como todos nosotros!
Wed Dec 23 2020 23:55:38 GMT+0700 (Western Indonesia Time)
Pünktlich zu Weihnachten halten wir unser Versprechen ein , Ihnen ein neues Whitepaper zu bringen – die Entwicklung des BEST Developer Framework durch Benchmarking . Dieser Beitrag untersucht drei Frameworks – Delphi , Windows Presentation Foundation (WPF) mit .NET Framework und Electron – eine 23-metric gewichtete Auswertung über die Angebote der besten Entwickler , um zu bestimmen Produktivität , Business – Funktionalität , Anwendungsflexibilität und Produktleistung . Diese erste Runde wählte Ein Windows 10-Taschenrechner-Klon als Benchmark, um die Fähigkeit jedes Frameworks zu untersuchen, eine bekannte GUI neu zu erstellen und auf die Windows-Desktopumgebung abzuzielen.
Unsere Ergebnisse sind für Delphi-Entwickler wahrscheinlich nicht überraschend – Delphi VCL und FMX haben die Konkurrenz aus dem Wasser geworfen und 4,66 von 5 Punkten erzielt. Electron war mit 3,11 Punkten eine entfernte Sekunde und WPF belegte den letzten Platz. Abgesehen von den Ergebnissen liefert die qualitative und quantitative Analyse einige Schlussfolgerungen:
Delphi und seine RAD Studio IDE verbessern die Entwicklungsproduktivität und die Markteinführungszeit des Produkts erheblich. Darüber hinaus vereinfacht die Entwicklung einer Codebasis für alle Desktop- und Mobilplattformen aufeinanderfolgende Releases und Produktwartungen.
WPF mit .NET Framework bietet kleinen Teams nativen Zugang zu Windows-Anwendungen und eine solide IDE, hat jedoch Schwierigkeiten, die Produktivität, IP-Sicherheit und Leistung von Delphi zu erreichen, während die plattformübergreifenden Funktionen von Delphi und Electron fehlen.
Electron bietet eine kostenlose Alternative zu Delphi und WPF, Vertrautheit mit Front-End-Entwicklern und plattformübergreifende Funktionen auf Kosten des IP-Schutzes, der Standard-IDE-Tools und der Anwendungsleistung.
Abbildung 2 – Vergleich von Delphi, WPF und Elektronen der Kategorie 4
Sie können dieses Dokument kostenlos herunterladen , indem Sie lp.embarcadero.com/Discovering_the_best_framework besuchen , Ihre E-Mail-Adresse eingeben und einem Link folgen, der an Ihren Posteingang gesendet wurde.
Community-Feedback
Dieses Papier soll ein Gespräch beginnen! Der gesamte Quellcode für dieses Projekt steht auf GitHub zur Verfügung, damit Sie ihn untersuchen und verbessern können. Lesen Sie das Papier, schreiben Sie einen Blog-Beitrag als Antwort oder eine bessere Taschenrechneranwendung und senden Sie eine GitHub- Pull-Anfrage, damit wir sie dem Repository hinzufügen können. Fehler gefunden? Reichen Sie ein Problem ein , damit wir dieses Projekt verbessern und Best Practices und Techniken für jedes Framework sammeln können. Keiner von uns ist so schlau wie wir alle!
Wed Dec 23 2020 23:42:53 GMT+0700 (Western Indonesia Time)
Antes do RAD Studio 10.4, o padrão da opção de isolamento de transação para conexões FireDAc era lido e confirmado. Isso é TFDConnection.TxOptions.Isolation foi xiReadCommitted. Este foi o valor definido para o componente e, sendo o padrão, ele não foi enviado para o banco de dados. FireDAC apenas assumiu que o valor padrão em sua configuração era o padrão do banco de dados e não enviou explicitamente essa configuração de isolamento para o banco de dados no início de uma sessão. Por exemplo, no MySQL o comando necessário é SET SESSION TRANSACTION ISOLATION LEVEL não foi executado se o padrão não foi modificado. Nesse caso, o isolamento da transação do MySQL permanecia com o valor padrão do banco de dados, que é xiRepeatableRead, independentemente do que foi definido na configuração padrão do FireDAC.
Para corrigir esse problema, decidimos que é melhor manter o nível de isolamento padrão em xiUnspecified, o que significa que se você não precisar de um nível de isolamento específico, a configuração padrão para o banco de dados específico é usada – esta é a que já está predefinida int O banco de dados e você não precisa pedir configuração. O nível de isolamento padrão é otimizado para um banco de dados específico, pois os padrões são diferentes e alguns dos níveis de isolamento nem mesmo são suportados por todos os mecanismos de banco de dados da mesma forma.
Se um desenvolvedor deseja usar um nível de isolamento diferente do padrão usado pelo banco de dados, ele deve ser definido explicitamente na configuração do componente ou no código. Se o desenvolvedor quiser usar o banco de dados padrão, nenhum código é necessário.
Aqui estão os níveis de isolamento padrão dos principais bancos de dados em termos FireDAC – novamente, o valor da propriedade é apenas xiUnspecified:
DB2 – xiReadCommitted
InterBase e Firebird – xiSnapshot
MySQL e MariaDB – xiRepeatableRead
Oracle – xiReadCommitted
Microsoft SQL Server – xiReadCommitted
SQLite – xiSerializible
PostgreSQL – xiReadCommitted
Espero que isso ajude a esclarecer a mudança e explicar como contorná-la, alterando o nível de isolamento da transação de sua conexão FireDAC para aquele de que você precisa especificamente, se diferente do padrão do banco de dados. Esta mudança não foi listada nas notas de lançamento do RAD Studio 10.4 e causou algumas preocupações (e relatórios de erros).
Tue Dec 22 2020 23:54:49 GMT+0700 (Western Indonesia Time)
Недавно выпущенный AMD Ryzen 9 5950x предлагает 16 ядер и 32 потока, поэтому давайте посмотрим, какую производительность мы можем получить от параллельной компиляции C ++ с этими 32 потоками. На момент написания этой статьи AMD Ryzen 9 5950x имел наивысший балл в тесте одноядерного процессора — около 3515. C ++ Builder — это инструмент быстрой разработки приложений для создания приложений Windows на C ++. Он предлагает обычную компиляцию и в самой последней версии включает надстройку TwineCompile, которая будет использовать все 32 потока от процессора Ryzen 5950x для одновременной компиляции нескольких файлов в проекте C ++. Мы сделали два предыдущих поста, в которых мы протестировали 5950x с ~ 750 тыс. Строккода, скомпилированным в Delphi, и параллельным построением 300 собственных приложений Windows в Delphi..
Проект, который я использовал для тестирования параллельной компиляции C ++, представляет собой большое приложение для Windows на C ++ со 128 формами и, согласно C ++ Builder, ~ 254 000 строк на C ++. Формы взяты из 50 форм проекта, которые можно найти в этом репозитории C ++ Cross Platform Samples . Мы использовали 50 форм 2 и 3 раза, чтобы получить число 128. Первоначально мы создали этот проект для тестирования AMD Ryzen Threadripper 3990x, который имеет 64 ядра и 128 потоков. В любом случае, когда у нас было 128 форм в проекте, мы добавили некоторый общий C ++ к каждому из 128 модулей, чтобы увеличить их количество до 1000 строк в каждой. Помните, что каждый проект представляет собой отдельную рабочую нагрузку, и результаты в ваших собственных проектах могут отличаться. Различные функции языка C ++ и конфигурации проекта могут влиять на время компиляции.
Ryzen Изображение любезно предоставлено AMD
Полные спецификации тестового компьютера AMD Ryzen 9 5950x: AMD Ryzen 9 5950x, ОЗУ DDR4 3200 МГц объемом 64 ГБ, твердотельный накопитель NVMe 1 ТБ + жесткий диск 2 ТБ, NVIDIA GeForce RTX 3070 8 ГБ и Windows 10 Pro. Чтобы отслеживать использование CPU и Disk IO в параллельной компиляции C ++ Builder, я использовал диспетчер задач DeLuxe или TMX (который также встроен в Delphi). Диспетчер задач DeLuxe впечатляет объемом информации о вашей системе Windows. TMX доступен в MiTeC который также создает широкий спектр компонентов Delphi, которые предоставляют вам доступ к той же информации, что и в TMX. Ниже представлен обзор потоков 32 CPU, который предоставляет TMX. Я сделал этот снимок экрана во время обычной синхронной компиляции C ++ Builder. На скриншоте видно, что на самом деле для компиляции одновременно используется только одно ядро.
Теперь давайте посмотрим на снимок экрана из диспетчера задач DeLuxe вскоре после параллельной компиляции C ++ с использованием TwineCompile в C ++ Builder. На этом снимке экрана вы увидите, что он использует все потоки для компиляции. Вы можете увидеть, как он использовал все 32 потока, а TMX также предоставляет удобный монитор тактовой частоты процессора, поскольку AMD Ryzen 9 5950x Turbo увеличивает до 4,9 ГГц (только 4,2 ГГц на скриншоте). Здесь следует отметить одну интересную вещь: поскольку турбо-ускорение с 3,9 ГГц до 4,9 ГГц не является согласованным, тесты меняются на несколько секунд при каждом запуске.
Если вы хотите узнать больше об архитектуре процессора AMD Ryzen 9 5950x, у AMD есть отличное видео, в котором объясняется архитектура Zen 3.
Приступим к сравнению чисел. В C ++ Builder можно выполнить несколько различных сборок. Это включает сборку отладки (-O0) и сборку выпуска. В сборке Release можно выбрать различные флаги оптимизации (-O1, -O2 и -O3). У каждого флага своя цель оптимизации. -O1 генерирует минимально возможный код, -O2 генерирует максимально быстрый код, а -O3 генерирует наиболее оптимизированный код. Согласно Embarcadero -O3 дает увеличение скорости вдвое по сравнению с -O2.
Сборки отладки — самые быстрые из четырех уровней оптимизации. В основном это имеет значение при использовании обычной компиляции, потому что сборки Release занимали на минуту больше, чем сборки Debug. При использовании параллельной компиляции процесс сборки был настолько быстрым как в режиме отладки, так и в режиме выпуска, что это не имело значения, поскольку все оценки довольно близки. Первая диаграмма здесь — это нормальная отладочная сборка C ++ (-O0), приходящаяся на 396 секунд, по сравнению с параллельной отладочной сборкой C ++ (-O0), приходящая на 33 секунды (в 12 раз быстрее!). Если мы запускаем числа по строкам кода в секунду, мы получаем около 7 696 строк кода в секунду, используя параллельный TwineCompile для -O0. Обычная отладочная синхронная сборка -O0 занимает 641 строку в секунду для компиляции.
На второй диаграмме мы видим, что нормальная сборка выпуска C ++ (-O1) приходит через 404 секунды, а сборка параллельной версии C ++ (-O1) — за 32 секунды (примерно в 12 раз быстрее!). Секунды параллельной сборки варьируются в зависимости от текущей скорости турбо-ускорения (от 3,9 до 4,9 ГГц). Если мы запустим числа по строкам кода в секунду, мы получим около 7937 строк кода в секунду, используя параллельный TwineCompile для -O1. Обычная синхронная сборка -O1 требует компиляции 628 строк в секунду.
На третьей диаграмме мы видим, что нормальная сборка выпуска C ++ (-O2) приходит через 449 секунд, тогда как сборка параллельной версии C ++ (-O2) приходит через 37 секунд (примерно в 12 раз быстрее!). Секунды параллельной сборки варьируются в зависимости от текущей скорости турбо-ускорения (от 3,9 до 4,9 ГГц). Если мы запустим числа по строкам кода в секунду, мы получим около 6864 строк кода в секунду, используя параллельный TwineCompile для -O2. Обычная синхронная сборка -O2 требует компиляции 565 строк в секунду.
На четвертой и последней диаграмме у нас есть сборка выпуска Normal C ++ (-O3), выходящая за 450 секунд, по сравнению с сборкой выпуска Parallel C ++ (-O3), приходящаяся на 36 секунд (примерно в 12 раз быстрее!). Секунды параллельной сборки варьируются в зависимости от текущей скорости турбо-ускорения (от 3,9 до 4,9 ГГц). Я видел здесь от 36 до 40 секунд. Если мы запустим числа по строкам кода в секунду, мы получим около 7055 строк кода в секунду, используя параллельный TwineCompile для -O3. Обычная синхронная сборка -O3 требует компиляции 564 строк в секунду.
Достаточно сказать, что параллельная компиляция значительно повысила производительность. Возможность скомпилировать большое приложение на C ++ примерно за 30 секунд позволяет выполнять итерацию быстрее (аналогично скорости итерации, которую можно выполнить в Delphi), потому что время компиляции очень быстрое. Я называю 128 форм и ~ 254 тыс. Строк кода для проекта Windows большим. Это, конечно, не маленький проект (2-3 формы) и уж точно не масштабный проект (миллионы и миллионы строк кода).
Теперь сравним компилятор Delphi 10.4.1 с параллельной компиляцией C ++ Builder. В нашем первом блогеВ этой серии ЦП AMD Ryzen 9 5950x компилирует обобщенный тяжелый код Object Pascal со скоростью около 61 500 строк в секунду, который может быть экстраполирован на 1 миллион строк тяжелого универсального кода Object Pascal за 16 секунд. Самая быстрая параллельная сборка C ++ Builder (-O1) компилирует 7937 строк кода в секунду, которые можно экстраполировать на 1 миллион строк C ++ за ~ 126 секунд. Тот же самый синхронный компилятор C ++ Builder -O1 составлял 628 строк кода в секунду, которые можно экстраполировать на 1 миллион строк кода C ++ за 1592 секунды. Как видите, параллельная компиляция C ++ Builder приближается к производительности Delphi со скоростью компиляции, поскольку она на порядки быстрее, чем обычная компиляция.C ++ Builder с параллельной компиляцией на современном оборудовании через TwineCompile может приблизить вас к производительности Delphi со скоростью и мощью C ++ для ваших приложений Windows.
Современное оборудование есть, и AMD Ryzen 9 5950x великолепен с его 16 ядрами и 32 потоками, но процессор Ryzen 9 5950x на самом деле трудно достать в настоящий момент. А как насчет использования TwineCompile на более старой машине? На самом деле я использовал i7-3770 с 4 ядрами и 8 потоками в течение последних 8 лет в качестве своего ежедневного драйвера. Технические характеристики этой машины — примерно Intel i7-3770, 16 ГБ ОЗУ, 1 ТБ SSD, Windows 10 Home. Это CPU тест оценка для одной нити 2069 против 3515 на 5950x. Единственное обновление, которое я действительно внес в него за 8 лет, — это установка SSD Samsung 860 EVO 1 ТБ, и это сильно изменило время компиляции. Я снова использовал диспетчер задач DeLuxe и сделал скриншоты обычной компиляции и параллельной компиляции на 8-поточной машине i7-3770. Сначала мы покажем обычную компиляцию в C ++ Builder. Как вы увидите на снимке экрана, для компиляции кода C ++ используется всего около 30% ЦП.
Затем давайте снова посмотрим на машину i7-3770, на этот раз используя C ++ Builder, параллельную компиляцию того же проекта из 128 форм и около 254 000 строк кода. Как вы увидите, на этот раз он задействует все 4 ядра и 8 потоков и использует всю мощность машины для компиляции.
Давайте посмотрим на некоторые цифры из этой машины при синхронной и параллельной компиляции того же проекта 128 form C ++ Builder. Первая диаграмма здесь — это нормальная отладочная сборка C ++ (-O0), приходящаяся на 1023 секунды, по сравнению с параллельной отладочной сборкой C ++ (-O0), приходящая на 170 секунд (в 6 раз быстрее!). Если мы запускаем числа по строкам кода в секунду, мы получаем около 1494 строк кода в секунду, используя параллельный TwineCompile для -O0. Обычная синхронная отладка -O0 компилируется со скоростью 248 строк в секунду.
Вторая диаграмма здесь — это нормальная сборка выпуска C ++ (-O2), поступающая через 935 секунд, по сравнению с сборкой параллельной версии C ++ (-O2), поступающая через 142 секунды (примерно в 6 раз быстрее!). Если мы запустим числа по строкам кода в секунду, мы получим около 1788 строк кода в секунду, используя параллельный TwineCompile для -O2. Обычная синхронная отладочная сборка -O2 требует компиляции со скоростью 271 строку в секунду. Здесь я вижу одну интересную вещь: на машине AMD Ryzen 9 3950x сборки отладки были быстрее, чем сборки выпуска, где, как и на более старой машине, здесь сборки отладки медленные. У меня нет точных цифр, но я предполагаю, что это может быть из-за того, что отладочные сборки больше, чем сборки релизов, и поэтому в игру вступает скорость твердотельного жесткого диска.
Как вы можете видеть, даже на более старом оборудовании параллельная компиляция C ++ Builder обеспечивает ОГРОМНЫЙ прирост производительности с гораздо более быстрым временем компиляции. Если у вас более старая машина, и у вас нет SSD, такого как Samsung 860 EVO, это простое обновление, позволяющее добиться гораздо большей производительности по сравнению с обычным жестким диском. Или, если вы используете более старую машину, которая не является, по крайней мере, четырехъядерным кодом, вы можете выбрать старые четырехъядерные машины по относительно низкой цене.
В любом случае, независимо от используемого оборудования (если оно имеет как минимум 2 ядра), вы увидите значительное увеличение времени компиляции для ваших проектов C ++ при использовании последней версии C ++ Builder с параллельной компиляцией через TwineCompile. В этом сообщении блога мы протестировали последний AMD Ryzen 9 5950x с его 16 ядрами и 32 потоками и убедительно показали, что он может иметь огромное значение для повышения вашей производительности за счет скорости итераций. Относительно большой проект Windows C ++ со 128 формами и более 254 000 строк кода может быть скомпилирован примерно за 30-40 секунд с помощью параллельной компиляции с 16 ядрами и 32 потоками. Это невероятно. На более старой машине, использующей обычную синхронную компиляцию, на один и тот же проект требовалось от ~ 15 минут до ~ 17 минут!
Сейчас прекрасное время, чтобы стать разработчиком C ++ для создания приложений Windows (и iOS) на C ++. Мы видели, как одно ядро на старом оборудовании может занять 60 минут для компиляции проекта C ++ с 1 миллионом строк кода, который теперь занимает всего ~ 2 минуты при параллельной компиляции на современном оборудовании! Параллельная компиляция обеспечивает столь необходимую продуктивность разработки на C ++ без ущерба для скорости и мощности производительности C ++ во время выполнения. C ++ Builder 10.4.1+ — это инструмент, который поможет вам в этом.
Tue Dec 22 2020 23:54:25 GMT+0700 (Western Indonesia Time)
O recém-lançado AMD Ryzen 9 5950x oferece 16 núcleos e 32 threads, então vamos ver que tipo de desempenho podemos obter de uma compilação paralela de C ++ com esses 32 threads. No momento em que este artigo foi escrito, o AMD Ryzen 9 5950x tinha a pontuação de benchmark de CPU de núcleo único mais alta, em torno de 3515. C ++ Builder é uma ferramenta de desenvolvimento de aplicativos rápida para criar aplicativos C ++ do Windows. Ele oferece compilação normal e na versão mais recente inclui um add-on chamado TwineCompile que usará todos os 32 threads do Ryzen 5950x powerhouse para compilar vários arquivos no projeto C ++ simultaneamente. Fizemos dois posts anteriores onde comparamos o 5950x com ~ 750k linhas de compilação de código em Delphi e construção paralela de 300 aplicativos nativos do Windows em Delphi.
O projeto que usei para testar a compilação paralela C ++ é um grande aplicativo C ++ do Windows com 128 formulários e, de acordo com o C ++ Builder, aproximadamente 254.000 linhas de C ++. Os formulários são retirados dos 50 formulários de projeto encontrados neste repositório C ++ Cross Platform Samples . Usamos os 50 formulários 2 e 3 vezes para chegar ao número 128. Originalmente, construímos este projeto para comparar o AMD Ryzen Threadripper 3990x, que tem 64 núcleos e 128 threads. Em qualquer caso, uma vez que tínhamos 128 formulários no projeto, adicionamos algum C ++ genérico a cada uma das 128 unidades para aumentá-las para mais de 1000 linhas cada. Lembre-se de que cada projeto representa uma carga de trabalho diferente e os resultados em seus próprios projetos podem variar. Diferentes recursos da linguagem C ++ e configurações de projeto podem afetar os tempos de compilação.
Ryzen Imagem cortesia da AMD
As especificações completas na máquina de benchmark AMD Ryzen 9 5950x são AMD Ryzen 9 5950x, 64 GB DDR4 3200 MHz de RAM, 1 TB NVMe SSD + 2 TB HDD, NVIDIA GeForce RTX 3070 8 GB e Windows 10 Pro. Para monitorar o uso da CPU e do disco IO da compilação paralela do C ++ Builder, usei o Gerenciador de Tarefas DeLuxe ou TMX (que também é construído em Delphi). O Task Manager DeLuxe é incrível pela quantidade de informações que fornece sobre o seu sistema Windows. TMX está disponível no MiTeC que também produz uma grande variedade de componentes Delphi que fornecem acesso a muitas das mesmas informações encontradas no TMX. Abaixo está a visualização de 32 threads de CPU que a TMX oferece. Eu fiz esta captura de tela durante a compilação normal do C ++ Builder síncrono. Você pode ver na imagem que ele está realmente usando apenas um único núcleo simultaneamente para a compilação.
A seguir, vamos dar uma olhada na captura de tela do Task Manager DeLuxe logo após a compilação paralela do C ++ usando TwineCompile no C ++ Builder. Você verá nesta imagem que ele usa todos os tópicos para a compilação. Você pode ver como ele usou todos os 32 threads e o TMX também oferece um prático monitor de velocidade do clock da CPU, já que o turbo AMD Ryzen 9 5950x aumenta para 4,9 GHz (apenas 4,2 GHz na imagem). Uma coisa interessante a notar aqui é que, como o turbo que aumenta de 3,9 Ghz para 4,9 Ghz não é consistente, os benchmarks mudam alguns segundos a cada execução.
Se você quiser saber mais sobre a arquitetura de CPU AMD Ryzen 9 5950x, a AMD tem um ótimo vídeo onde explica a arquitetura Zen 3.
Vamos fazer a comparação dos números. Existem vários tipos diferentes de compilações que podem ser feitas no C ++ Builder. Isso inclui uma compilação de depuração (-O0) e uma compilação de lançamento. Na versão Release, diferentes sinalizadores de otimização podem ser selecionados (-O1, -O2 e -O3). Cada sinalizador possui um alvo de otimização diferente. -O1 gera o menor código possível, -O2 gera o código mais rápido possível e -O3 gera o código mais otimizado. De acordo com a Embarcadero -O3 oferece melhorias de velocidade de até duas vezes o desempenho de -O2.
As compilações de depuração são as mais rápidas dos quatro níveis de otimização. Isso faz a diferença principalmente ao usar a compilação normal porque demorou um minuto a mais para as compilações de Release do que as compilações de Debug. Ao usar a compilação paralela, o processo de construção foi tão rápido no modo de depuração e no modo de liberação que quase não importou, pois todas as pontuações estão muito próximas. O primeiro gráfico aqui é a compilação de depuração C ++ normal (-O0) chegando em 396 segundos versus a compilação de depuração C ++ paralela (-O0) chegando em 33 segundos (12X mais rápido!). Se executarmos os números em linhas de código por segundo, obteremos cerca de 7.696 linhas de código por segundo usando o TwineCompile paralelo para -O0. A compilação síncrona de depuração normal -O0 vem com 641 linhas por segundo para compilar.
No segundo gráfico, temos a versão Normal C ++ Release (-O1) chegando a 404 segundos versus a versão Parallel C ++ Release (-O1) chegando a 32 segundos (~ 12X mais rápido!). Os segundos de construção paralela variam dependendo da velocidade atual do turbo boost (em qualquer lugar entre 3,9 Ghz e 4,9 Ghz). Se executarmos os números em linhas de código por segundo, obteremos cerca de 7.937 linhas de código por segundo usando o TwineCompile paralelo para -O1. A compilação síncrona normal -O1 vem em 628 linhas por segundo para compilar.
No terceiro gráfico, temos a versão Normal C ++ Release (-O2) chegando em 449 segundos versus a versão Parallel C ++ Release Build (-O2) chegando em 37 segundos (~ 12X mais rápido!). Os segundos de construção paralela variam dependendo da velocidade atual do turbo boost (em qualquer lugar entre 3,9 Ghz e 4,9 Ghz). Se executarmos os números em linhas de código por segundo, obteremos cerca de 6.864 linhas de código por segundo usando o TwineCompile paralelo para -O2. O build normal de -O2 síncrono chega a 565 linhas por segundo para compilar.
No quarto e último gráfico, temos a versão Normal C ++ Release (-O3) chegando a 450 segundos versus a versão Parallel C ++ Release Build (-O3) chegando a 36 segundos (~ 12X mais rápido!). Os segundos de construção paralela variam dependendo da velocidade atual do turbo boost (em qualquer lugar entre 3,9 Ghz e 4,9 Ghz). Eu vi entre 36 segundos e 40 segundos aqui. Se executarmos os números em linhas de código por segundo, obteremos cerca de 7.055 linhas de código por segundo usando o TwineCompile paralelo para -O3. A compilação síncrona normal -O3 vem com 564 linhas por segundo para compilar.
Basta dizer que o aumento da produtividade por ter compilação paralela é significativo. Ser capaz de compilar um aplicativo C ++ grande em cerca de 30 segundos permite que você itere mais rápido (semelhante à velocidade de iteração que pode ser feita no Delphi) porque os tempos de compilação são muito rápidos. Eu considero 128 formulários e ~ 254k linhas de código para um projeto do Windows ser grande. Certamente não é um projeto pequeno (2-3 formulários) e certamente não é um projeto enorme (milhões e milhões de linhas de código).
Agora vamos comparar o compilador Delphi 10.4.1 com a compilação C ++ Builder Parallel. No nosso primeiro blognesta série, uma CPU AMD Ryzen 9 5950x compila código Object Pascal pesado de genéricos em cerca de 61.500 linhas por segundo, que pode ser extrapolado para 1 milhão de linhas de código Object Pascal pesado de genéricos em 16 segundos. A compilação paralela mais rápida do C ++ Builder (-O1) compila 7.937 linhas de código por segundo, que podem ser extrapoladas para 1 milhão de linhas de C ++ em aproximadamente 126 segundos. A mesma compilação C ++ síncrona do C ++ Builder -O1 tinha 628 linhas de código por segundo, que podem ser extrapoladas para 1 milhão de linhas de código C ++ em 1592 segundos. Como você pode ver, a compilação paralela do C ++ Builder se aproxima da produtividade do Delphi com velocidades de compilação, pois é ordens de magnitude mais rápida do que a compilação normal.O C ++ Builder com compilação paralela em hardware moderno por meio do TwineCompile pode aproximar você da produtividade do Delphi com a velocidade e o poder do C ++ para seus aplicativos Windows.
O hardware moderno é, e o AMD Ryzen 9 5950x é ótimo com seus 16 núcleos e 32 threads, mas o CPU Ryzen 9 5950x é realmente difícil de conseguir no momento. Que tal usar o TwineCompile em uma máquina mais antiga? Na verdade, tenho usado um i7-3770 com 4 núcleos e 8 threads nos últimos 8 anos como meu driver diário. As especificações desta máquina são aproximadamente Intel i7-3770, 16 GB de RAM, SSD de 1 TB, Windows 10 Home. Sua pontuação de benchmark de CPU para um único thread é 2069 contra 3515 no 5950x. A única atualização que eu realmente fiz em 8 anos foi colocar um SSD Samsung 860 EVO de 1 TB e isso fez uma grande diferença nos tempos de compilação. Usei o Gerenciador de Tarefas DeLuxe novamente e tirei screenshots da compilação normal e da compilação paralela na máquina de 8 threads i7-3770. Primeiro, mostraremos uma compilação normal no C ++ Builder. Como você verá na imagem, ele usa apenas cerca de 30% da CPU para compilar o código C ++.
A seguir, vamos dar uma olhada na máquina i7-3770 novamente, desta vez usando o C ++ Builder, compilando paralelamente o mesmo projeto de 128 formulários e cerca de 254.000 linhas de código. Como você verá desta vez, ele está atingindo todos os 4 núcleos e 8 threads e usando todo o poder da máquina para compilar.
Vamos ver alguns números dessa máquina ao compilar o mesmo projeto C ++ Builder de 128 formulários de forma síncrona e em paralelo. O primeiro gráfico aqui é a compilação de depuração C ++ normal (-O0) chegando a 1023 segundos versus a compilação de depuração C ++ paralela (-O0) chegando a 170 segundos (6X mais rápido!). Se executarmos os números em linhas de código por segundo, obteremos cerca de 1494 linhas de código por segundo usando o TwineCompile paralelo para -O0. A compilação normal de depuração síncrona -O0 vem com 248 linhas por segundo para compilar.
O segundo gráfico aqui é a versão normal do C ++ (-O2) chegando a 935 segundos versus a versão paralela do C ++ (-O2) chegando a 142 segundos (~ 6X mais rápido!). Se executarmos os números em linhas de código por segundo, obteremos cerca de 1788 linhas de código por segundo usando o TwineCompile paralelo para -O2. A compilação de -O2 síncrona de depuração normal vem com 271 linhas por segundo para compilar. Uma coisa interessante que vejo aqui é que na máquina AMD Ryzen 9 3950x as compilações de depuração foram mais rápidas do que as compilações de lançamento, onde, como na máquina mais antiga, as compilações de depuração são lentas. Não tenho nenhum número fixo, mas acho que isso pode ser devido a compilações de depuração serem maiores do que as compilações de lançamento e, portanto, a velocidade do disco rígido de estado sólido entra em jogo.
Como você pode ver, mesmo em hardware mais antigo, a compilação paralela do C ++ Builder fornece um ENORME aumento de produtividade com tempos de compilação muito mais rápidos. Se você tem uma máquina mais antiga e não está executando um SSD como o Samsung 860 EVO, essa é uma atualização fácil para obter um desempenho muito melhor em um disco rígido normal. Ou se você estiver executando uma máquina mais antiga que não seja pelo menos quad code, você pode adquirir máquinas quad core mais antigas por um custo relativamente baixo.
Em qualquer caso, independentemente do hardware que você está executando (desde que tenha pelo menos 2 núcleos), você verá um aumento significativo no tempo de compilação para seus projetos C ++ ao usar o C ++ Builder mais recente com compilação paralela por meio do TwineCompile. Nesta postagem do blog, comparamos o último AMD Ryzen 9 5950x com seus 16 núcleos e 32 threads e mostramos de forma conclusiva que ele pode fazer uma grande diferença para aumentar sua produtividade por meio da velocidade de iteração. Um projeto Windows C ++ relativamente grande com 128 formulários e mais de 254.000 linhas de código pode ser compilado em cerca de 30-40 segundos por meio da compilação paralela com 16 núcleos e 32 threads. Isso é incrivel. Uma máquina mais antiga usando compilação síncrona normal levou entre ~ 15 minutos e ~ 17 minutos para o mesmo projeto!
Agora é um ótimo momento para ser um desenvolvedor C ++ para criar aplicativos do Windows (e iOS) em C ++. Vimos como um único núcleo em hardware mais antigo pode levar 60 minutos para compilar um projeto C ++ com 1 milhão de linhas de código, o que agora leva apenas cerca de 2 minutos usando compilação paralela em hardware moderno! A compilação paralela traz a produtividade necessária para o desenvolvimento em C ++ sem sacrificar a velocidade e o poder do desempenho de tempo de execução do C ++. C ++ Builder 10.4.1+ é a ferramenta que pode levar você até lá.
Tue Dec 22 2020 23:53:40 GMT+0700 (Western Indonesia Time)
El AMD Ryzen 9 5950x recientemente lanzado ofrece 16 núcleos y 32 subprocesos, así que veamos qué tipo de rendimiento podemos obtener de una compilación paralela de C ++ con esos 32 subprocesos. En el momento de redactar este artículo, AMD Ryzen 9 5950x tiene el puntaje de referencia de CPU de un solo núcleo más alto en alrededor de 3515. C ++ Builder es una herramienta de desarrollo de aplicaciones rápido para crear aplicaciones C ++ de Windows. Ofrece compilación normal y en la versión más reciente incluye un complemento llamado TwineCompile que usará los 32 subprocesos de la central eléctrica Ryzen 5950x para compilar múltiples archivos en el proyecto C ++ simultáneamente. Hicimos dos publicaciones anteriores en las que comparamos el 5950x con ~ 750k líneas de código compilado en Delphi y construimos en paralelo 300 aplicaciones nativas de Windows en Delphi.
El proyecto que utilicé para probar la compilación paralela de C ++ es una gran aplicación C ++ de Windows con 128 formularios y, según C ++ Builder, ~ 254.000 líneas de C ++. Los formularios se toman de los 50 formularios de proyectos que se encuentran en este repositorio de ejemplos multiplataforma de C ++ . Usamos las 50 formas 2 y 3 veces para llegar al número 128. Originalmente, creamos este proyecto para comparar el AMD Ryzen Threadripper 3990x que tiene 64 núcleos y 128 hilos. En cualquier caso, una vez que tuvimos 128 formularios en el proyecto, agregamos algo de C ++ genérico a cada una de las 128 unidades para llevarlas a más de 1000 líneas cada una. Tenga en cuenta que cada proyecto es una carga de trabajo diferente y los resultados en sus propios proyectos pueden variar. Diferentes características del lenguaje C ++ y configuraciones de proyectos pueden afectar los tiempos de compilación.
Ryzen Image courtesy of AMD
Las especificaciones completas de la máquina de referencia AMD Ryzen 9 5950x son AMD Ryzen 9 5950x, 64GB DDR4 3200MHz RAM, 1TB NVMe SSD + 2TB HDD, NVIDIA GeForce RTX 3070 8GB y Windows 10 Pro. Para monitorear el uso de CPU y Disk IO de la compilación paralela de C ++ Builder, utilicé Task Manager DeLuxe o TMX (que también está integrado en Delphi). Task Manager DeLuxe es bastante sorprendente por la cantidad de información que proporciona sobre su sistema Windows. TMX está disponible en MiTeC que también hace una amplia variedad de componentes Delphi que le dan acceso a mucha de la misma información que se encuentra en TMX. A continuación se muestra la vista de subprocesos de 32 CPU que proporciona TMX. Tomé esta captura de pantalla durante la compilación normal sincrónica de C ++ Builder. Puede ver en la captura de pantalla que en realidad solo está usando un solo núcleo simultáneamente para la compilación.
A continuación, echemos un vistazo a la captura de pantalla del Administrador de tareas DeLuxe poco después de la compilación paralela de C ++ utilizando TwineCompile en C ++ Builder. Verá en esta captura de pantalla que usa todos los hilos para la compilación. Puede ver cómo usó los 32 subprocesos y TMX también proporciona un práctico monitor de velocidad de reloj de la CPU, ya que el AMD Ryzen 9 5950x turbo aumenta hasta 4.9Ghz (solo 4.2Ghz en la captura de pantalla). Una cosa interesante a tener en cuenta aquí es que debido a que el aumento del turbo de 3.9 Ghz a 4.9 Ghz no es consistente, los puntos de referencia cambian unos segundos en cada ejecución.
Si quieres saber más sobre la arquitectura de la CPU AMD Ryzen 9 5950x, AMD tiene un gran video donde explican la arquitectura Zen 3.
Vayamos a la comparación de los números. Hay varios tipos diferentes de compilaciones que se pueden realizar en C ++ Builder. Esto incluye una compilación de depuración (-O0) y una compilación de lanzamiento. En la versión Release se pueden seleccionar diferentes indicadores de optimización (-O1, -O2 y -O3). Cada bandera tiene un objetivo de optimización diferente. -O1 genera el código más pequeño posible, -O2 genera el código más rápido posible y -O3 genera el código más optimizado. Según Embarcadero -O3 ofrece mejoras de velocidad de hasta el doble del rendimiento de -O2.
Las compilaciones de depuración son las más rápidas de los cuatro niveles de optimización. Esto marca la diferencia principalmente cuando se usa la compilación normal porque las compilaciones de la versión demoraron hasta un minuto más que las compilaciones de depuración. Al usar la compilación en paralelo, el proceso de compilación fue tan rápido tanto en el modo de depuración como en el de lanzamiento, que apenas importó, ya que todas las puntuaciones están bastante juntas. El primer gráfico aquí es la compilación de depuración de C ++ normal (-O0) que llega a los 396 segundos frente a la compilación de depuración de C ++ paralela (-O0) que llega a los 33 segundos (¡12 veces más rápido!). Si ejecutamos los números en líneas de código por segundo, obtenemos alrededor de 7,696 líneas de código por segundo usando TwineCompile paralelo para -O0. La compilación normal de depuración síncrona -O0 llega a 641 líneas por segundo para compilar.
En el segundo gráfico, tenemos la versión normal de C ++ Release (-O1) que llega a los 404 segundos frente a la Parallel C ++ Release Build (-O1) que llega a los 32 segundos (¡~ 12 veces más rápido!). Los segundos de construcción en paralelo varían según la velocidad actual del turbo boost (en cualquier lugar entre 3.9 Ghz y 4.9 Ghz). Si ejecutamos los números en líneas de código por segundo, obtenemos alrededor de 7937 líneas de código por segundo usando TwineCompile paralelo para -O1. La compilación normal sincrónica de -O1 llega a 628 líneas por segundo para compilar.
En el tercer gráfico, tenemos la versión normal de C ++ Release (-O2) con 449 segundos frente a la versión Parallel C ++ Release (-O2) con 37 segundos (¡~ 12 veces más rápido!). Los segundos de construcción en paralelo varían según la velocidad actual del turbo boost (en cualquier lugar entre 3.9 Ghz y 4.9 Ghz). Si ejecutamos los números en líneas de código por segundo, obtenemos alrededor de 6,864 líneas de código por segundo usando TwineCompile paralelo para -O2. La compilación de -O2 síncrona normal llega a 565 líneas por segundo para compilar.
En el cuarto y último gráfico, tenemos la versión normal de C ++ Release (-O3) que llega a los 450 segundos frente a la Parallel C ++ Release Build (-O3) que llega a los 36 segundos (¡~ 12 veces más rápido!). Los segundos de construcción en paralelo varían según la velocidad actual del turbo boost (en cualquier lugar entre 3.9 Ghz y 4.9 Ghz). Vi entre 36 segundos y 40 segundos aquí. Si ejecutamos los números en líneas de código por segundo, obtenemos alrededor de 7.055 líneas de código por segundo usando TwineCompile paralelo para -O3. La compilación de -O3 sincrónica normal llega a 564 líneas por segundo para compilar.
Basta decir que el aumento de la productividad al tener una compilación en paralelo es significativo. Ser capaz de compilar una gran aplicación C ++ en unos 30 segundos le permite iterar más rápido (similar a la velocidad de iteración que se puede hacer en Delphi) porque los tiempos de compilación son muy rápidos. Califico 128 formularios y ~ 254k líneas de código para que un proyecto de Windows sea grande. Ciertamente no es un proyecto pequeño (2-3 formularios) y ciertamente no es un proyecto masivo (millones y millones de líneas de código).
Ahora comparemos el compilador Delphi 10.4.1 con el compilador C ++ Builder Parallel. En nuestro primer blogEn esta serie, una CPU AMD Ryzen 9 5950x compila código Object Pascal pesado genérico a alrededor de 61,500 líneas por segundo que se puede extrapolar a 1 millón de líneas de código Object Pascal pesado genérico en 16 segundos. La compilación paralela de C ++ Builder (-O1) más rápida compila 7937 líneas de código por segundo que se pueden extrapolar a 1 millón de líneas de C ++ en ~ 126 segundos. La misma compilación de C ++ síncrona de C ++ Builder -O1 fue de 628 líneas de código por segundo que se pueden extrapolar a 1 millón de líneas de código C ++ en 1592 segundos. Como puede ver, la compilación paralela de C ++ Builder se acerca a la productividad de Delphi con velocidades de compilación, ya que es órdenes de magnitud más rápida que la compilación normal.C ++ Builder con compilación paralela en hardware moderno a través de TwineCompile puede acercarlo a la productividad de Delphi con la velocidad y potencia de C ++ para sus aplicaciones de Windows.
El hardware moderno es y el AMD Ryzen 9 5950x es excelente con sus 16 núcleos y 32 subprocesos, pero la CPU Ryzen 9 5950x es realmente difícil de conseguir en este momento. ¿Qué pasa con el uso de TwineCompile en una máquina más antigua? De hecho, he estado usando un i7-3770 con 4 núcleos y 8 hilos durante los últimos 8 años como mi controlador diario. Las especificaciones de esta máquina son aproximadamente un Intel i7-3770, 16GB RAM, 1TB SSD, Windows 10 Home. Su puntuación de referencia de CPU para un solo hilo es 2069 frente a 3515 en el 5950x. La única actualización que realmente le hice en 8 años fue instalar un SSD Samsung 860 EVO 1TB y eso ha marcado una gran diferencia con los tiempos de compilación. Usé Task Manager DeLuxe nuevamente y tomé capturas de pantalla de la compilación normal y la compilación paralela en la máquina i7-3770 de 8 hilos. Primero mostraremos una compilación normal en C ++ Builder. Como verá en la captura de pantalla, solo está usando alrededor del 30% de la CPU para compilar el código C ++.
A continuación, echemos un vistazo a la máquina i7-3770 nuevamente, esta vez usando C ++ Builder compilando en paralelo el mismo proyecto de 128 formularios y alrededor de 254,000 líneas de código. Como verá, esta vez está alcanzando los 4 núcleos y 8 subprocesos y utilizando toda la potencia de la máquina para compilar.
Veamos algunos números de esta máquina al compilar el mismo proyecto de C ++ Builder en formato 128 de forma sincrónica y en paralelo. El primer gráfico aquí es la compilación de depuración de C ++ normal (-O0) que llega a los 1023 segundos frente a la compilación de depuración de C ++ paralela (-O0) que llega a los 170 segundos (¡6 veces más rápido!). Si ejecutamos los números en líneas de código por segundo, obtenemos alrededor de 1494 líneas de código por segundo utilizando TwineCompile paralelo para -O0. La compilación normal de depuración síncrona -O0 llega a 248 líneas por segundo para compilar.
El segundo gráfico aquí es la versión normal de C ++ Release (-O2) que llega a los 935 segundos frente a la versión Parallel C ++ Release Build (-O2) que llega a los 142 segundos (¡~ 6 veces más rápido!). Si ejecutamos los números en líneas de código por segundo, obtenemos alrededor de 1788 líneas de código por segundo usando TwineCompile paralelo para -O2. La compilación normal de depuración síncrona -O2 llega a 271 líneas por segundo para compilar. Una cosa interesante que veo aquí es que en la máquina AMD Ryzen 9 3950x las compilaciones de depuración fueron más rápidas que las compilaciones de lanzamiento, mientras que en la máquina más antigua aquí las compilaciones de depuración son lentas. No tengo números concretos, pero supongo que esto podría deberse a que las versiones de depuración son más grandes que las versiones de lanzamiento y, por lo tanto, entra en juego la velocidad del disco duro de estado sólido.
Como puede ver incluso en hardware más antiguo, la compilación paralela de C ++ Builder proporciona un ENORME aumento de la productividad con tiempos de compilación mucho más rápidos. Si tiene una máquina más antigua y no está ejecutando un SSD como el Samsung 860 EVO, es una actualización fácil para lograr un rendimiento mucho mejor que un disco duro normal. O si está ejecutando una máquina más antigua que no es al menos de código cuádruple, puede elegir máquinas de cuatro núcleos más antiguas a un costo relativamente bajo.
En cualquier caso, independientemente del hardware que esté ejecutando (siempre que tenga al menos 2 núcleos), verá un aumento significativo del tiempo de compilación para sus proyectos de C ++ cuando utilice el último C ++ Builder con compilación en paralelo a través de TwineCompile. En esta publicación de blog, comparamos el último AMD Ryzen 9 5950x con sus 16 núcleos y 32 subprocesos y hemos demostrado de manera concluyente que puede marcar una gran diferencia para aumentar su productividad a través de la velocidad de iteración. Un proyecto de Windows C ++ relativamente grande con 128 formularios y más de 254.000 líneas de código se puede compilar en unos 30-40 segundos a través de la compilación en paralelo con 16 núcleos y 32 hilos. Eso es increíble. Una máquina más antigua que usa la compilación sincrónica normal tomó entre ~ 15 minutos y ~ 17 minutos para el mismo proyecto.
Ahora es un buen momento para ser un desarrollador de C ++ para crear aplicaciones de Windows (e iOS) en C ++. ¡Hemos visto cómo un solo núcleo en hardware antiguo puede tardar 60 minutos en compilar un proyecto C ++ con 1 millón de líneas de código que ahora solo toma ~ 2 minutos usando la compilación paralela en hardware moderno! La compilación en paralelo aporta una productividad muy necesaria al desarrollo de C ++ sin sacrificar la velocidad y la potencia del rendimiento en tiempo de ejecución de C ++. C ++ Builder 10.4.1+ es la herramienta que puede llevarlo allí.
Tue Dec 22 2020 22:33:12 GMT+0700 (Western Indonesia Time)
Der kürzlich veröffentlichte AMD Ryzen 9 5950x bietet 16 Kerne und 32 Threads. Lassen Sie uns also sehen, welche Leistung wir aus einer parallelen C++ – Kompilierung mit diesen 32 Threads ziehen können. Zum Zeitpunkt dieses Schreibens weist der AMD Ryzen 9 5950x mit rund 3515 den höchsten Single-Core- CPU-Benchmark- Wert auf. C++Builder ist ein schnelles Tool zur Anwendungsentwicklung zum Erstellen von C++ – Windows-Apps. Es bietet normale Kompilierung und enthält in der neuesten Version ein Add-On namens TwineCompile , das alle 32 Threads des Ryzen 5950x-Kraftpakets verwendet, um mehrere Dateien im C++ – Projekt gleichzeitig zu kompilieren. Wir haben zwei frühere Beiträge verfasst, in denen wir den 5950x mit ~ 750.000 Codezeilen verglichen haben, die in Delphi kompiliert wurden, und 300 native Windows-Apps in Delphi parallel erstellt haben.
Das Projekt, das ich zum Testen der parallelen C++ – Kompilierung verwendet habe, ist eine große C++ – Windows-App mit 128 Formularen und laut C++Builder ~ 254.000 Zeilen C++. Die Formulare stammen aus den 50 Projektformularen in diesem C++ Cross Platform Samples- Repository. Wir haben die 50 Formulare 2 und 3 Mal verwendet, um zur 128-Nummer zu gelangen. Ursprünglich haben wir dieses Projekt gebaut, um den AMD Ryzen Threadripper 3990x mit 64 Kernen und 128 Threads zu bewerten. Sobald wir 128 Formulare im Projekt hatten, fügten wir jeder der 128 Einheiten generisches C++ hinzu, um sie auf jeweils über 1000 Zeilen zu bringen. Beachten Sie, dass jedes Projekt eine andere Arbeitsbelastung aufweist und die Ergebnisse in Ihren eigenen Projekten variieren können. Verschiedene C++ – Sprachfunktionen und Projektkonfigurationen können sich auf die Kompilierungszeiten auswirken.
Ryzen Bild mit freundlicher Genehmigung von AMD
Die vollständigen technischen Daten des AMD Ryzen 9 5950x-Benchmark-Computers sind AMD Ryzen 9 5950x, 64 GB DDR4 3200 MHz RAM, 1 TB NVMe SSD + 2 TB Festplatte, NVIDIA GeForce RTX 3070 8 GB und Windows 10 Pro. Um die CPU- und Festplatten-E / A-Nutzung der parallelen Kompilierung von C ++ Builder zu überwachen, habe ich Task Manager DeLuxe oder TMX (ebenfalls in Delphi integriert) verwendet. Der Task-Manager DeLuxe bietet eine erstaunliche Menge an Informationen zu Ihrem Windows-System. TMX ist bei MiTeC erhältlich Dadurch werden auch eine Vielzahl von Delphi-Komponenten hergestellt, mit denen Sie auf viele der gleichen Informationen zugreifen können, die in TMX enthalten sind. Unten finden Sie die 32-CPU-Thread-Ansicht, die TMX bietet. Ich habe diesen Screenshot während der normalen synchronen C++Builder-Kompilierung gemacht. Sie können im Screenshot sehen, dass wirklich nur ein einziger Kern gleichzeitig für die Kompilierung verwendet wird.
Schauen wir uns als nächstes den Screenshot aus dem Task Manager DeLuxe kurz nach der parallelen C++-Kompilierung mit TwineCompile in C++Builder an. Sie werden in diesem Screenshot sehen, dass er alle Threads für die Kompilierung verwendet. Sie können sehen, wie alle 32 Threads verwendet wurden. TMX bietet auch eine praktische Überwachung der CPU-Taktfrequenz, da der AMD Ryzen 9 5950x Turbo-Boost bis zu 4,9Ghz erreicht (im Screenshot nur 4,2Ghz). Interessant ist hier, dass sich die Benchmarks bei jedem Durchlauf um ein paar Sekunden ändern, da das Turbo-Boosting von 3,9 Ghz auf 4,9 Ghz nicht konsistent ist.
Wenn Sie mehr über die AMD Ryzen 9 5950x CPU-Architektur erfahren möchten, hat AMD ein großartiges Video, in dem sie die Zen 3-Architektur erklären.
Kommen wir nun zum Vergleich der Zahlen. Es gibt eine Reihe von verschiedenen Arten von Builds, die in C++Builder durchgeführt werden können. Dazu gehören ein Debug-Build (-O0) und ein Release-Build. Beim Release-Build können verschiedene Optimierungsflags ausgewählt werden (-O1, -O2 und -O3). Jedes Flag hat ein anderes Optimierungsziel. -O1 erzeugt den kleinstmöglichen Code, -O2 erzeugt den schnellstmöglichen Code und -O3 erzeugt den am meisten optimierten Code. Laut Embarcadero bringt -O3 Geschwindigkeitsverbesserungen von bis zu doppelt so viel Leistung wie -O2.
Die Debug-Builds sind die schnellsten der vier Optimierungsstufen. Dies macht sich vor allem beim normalen Kompilieren bemerkbar, da die Release-Builds bis zu einer Minute länger brauchen als die Debug-Builds. Bei Verwendung der parallelen Kompilierung war der Build-Prozess sowohl im Debug- als auch im Release-Modus so schnell, dass es kaum eine Rolle spielt, da die Ergebnisse alle ziemlich nah beieinander liegen. Das erste Diagramm hier zeigt den normalen C++-Debug-Build (-O0) mit 396 Sekunden im Vergleich zum parallelen C++-Debug-Build (-O0) mit 33 Sekunden (12-mal schneller!). Wenn wir die Zahlen auf Codezeilen pro Sekunde umrechnen, erhalten wir etwa 7.696 Codezeilen pro Sekunde, wenn wir das parallele TwineCompile für -O0 verwenden. Der normale Debug-Synchron-Build für -O0 kommt auf 641 Zeilen pro Sekunde zum Kompilieren.
Im zweiten Diagramm haben wir den normalen C++ Release Build (-O1) mit 404 Sekunden gegenüber dem parallelen C++ Release Build (-O1) mit 32 Sekunden (~12X schneller!). Die Sekunden für den parallelen Build variieren je nach aktueller Geschwindigkeit des Turbo Boosts (irgendwo zwischen 3,9 Ghz und 4,9 Ghz). Wenn wir die Zahlen auf Codezeilen pro Sekunde umrechnen, erhalten wir etwa 7.937 Codezeilen pro Sekunde, wenn wir das parallele TwineCompile für -O1 verwenden. Der normale synchrone -O1-Build kommt auf 628 Zeilen pro Sekunde zum Kompilieren.
Im dritten Diagramm sehen wir den normalen C++ Release Build (-O2) mit 449 Sekunden gegenüber dem parallelen C++ Release Build (-O2) mit 37 Sekunden (~12X schneller!). Die Sekunden für den parallelen Build variieren je nach aktueller Geschwindigkeit des Turbo Boosts (irgendwo zwischen 3,9 Ghz und 4,9 Ghz). Wenn wir die Zahlen auf Codezeilen pro Sekunde umrechnen, erhalten wir etwa 6.864 Codezeilen pro Sekunde mit dem parallelen TwineCompile für -O2. Der normale synchrone -O2-Build kommt auf 565 Zeilen pro Sekunde zum Kompilieren.
Im vierten und letzten Diagramm haben wir den normalen C++ Release Build (-O3) mit 450 Sekunden gegenüber dem parallelen C++ Release Build (-O3) mit 36 Sekunden (~12X schneller!). Die Sekunden des parallelen Builds variieren je nach aktueller Geschwindigkeit des Turbo Boosts (irgendwo zwischen 3,9 Ghz und 4,9 Ghz). Ich habe hier zwischen 36 Sekunden und 40 Sekunden gesehen. Wenn wir die Zahlen auf Codezeilen pro Sekunde umrechnen, erhalten wir etwa 7.055 Codezeilen pro Sekunde, wenn wir das parallele TwineCompile für -O3 verwenden. Der normale synchrone -O3-Build kommt auf 564 Zeilen pro Sekunde zum Kompilieren.
Es genügt zu sagen, dass der Produktivitätsschub durch die parallele Kompilierung signifikant ist. Wenn man in der Lage ist, eine große C++-Anwendung in etwa 30 Sekunden zu kompilieren, kann man schneller iterieren (ähnlich der Iterationsgeschwindigkeit, die man in Delphi erreichen kann), weil die Kompilierzeiten so schnell sind. Ich bezeichne 128 Formulare und ~254k Zeilen Code für ein Windows-Projekt als groß. Es ist sicherlich kein kleines Projekt (2-3 Formulare) und es ist sicherlich kein großes Projekt (Millionen und Abermillionen von Codezeilen).
Vergleichen wir nun den Delphi 10.4.1-Compiler mit dem C++Builder Parallel-Compiler. In unserem ersten Blog in dieser Serie kompiliert eine AMD Ryzen 9 5950x CPU generiklastigen Object Pascal Code mit etwa 61.500 Zeilen pro Sekunde, was auf 1 Million Zeilen generiklastigen Object Pascal Code in 16 Sekunden hochgerechnet werden kann. Der schnellste parallele C++Builder-Build (-O1) kompiliert 7.937 Zeilen Code pro Sekunde, was auf 1 Million Zeilen C++ in ~126 Sekunden extrapoliert werden kann. Die gleiche synchrone C++-Kompilierung mit C++Builder -O1 betrug 628 Codezeilen pro Sekunde, was auf 1 Million C++-Codezeilen in 1592 Sekunden hochgerechnet werden kann. Wie Sie sehen können, nähert sich die parallele Kompilierung in C++Builder der Produktivität von Delphi an, da die Kompiliergeschwindigkeit um Größenordnungen schneller ist als die normale Kompilierung. C++Builder mit paralleler Kompilierung auf moderner Hardware durch TwineCompile kann Sie nahe an die Produktivität von Delphi mit der Geschwindigkeit und Leistung von C++ für Ihre Windows-Anwendungen bringen.
Moderne Hardware ist und der AMD Ryzen 9 5950x ist mit seinen 16 Kernen und 32 Threads großartig, aber die Ryzen 9 5950x CPU ist im Moment tatsächlich schwer zu bekommen. Wie sieht es mit der Verwendung von TwineCompile auf einer älteren Maschine aus? Ich habe in den letzten 8 Jahren einen i7-3770 mit 4 Kernen und 8 Threads als meinen täglichen Fahrer benutzt. Die Spezifikationen dieses Rechners sind ungefähr ein Intel i7-3770, 16GB RAM, 1TB SSD, Windows 10 Home. Sein CPU-Benchmark-Ergebnis für einen einzelnen Thread liegt bei 2069 im Vergleich zu 3515 beim 5950x. Das einzige Upgrade, das ich in den letzten 8 Jahren vorgenommen habe, war der Einbau einer Samsung 860 EVO 1TB SSD und das hat einen großen Unterschied bei den Kompilierzeiten gemacht. Ich habe wieder den Task Manager DeLuxe verwendet und Screenshots des normalen Kompilierens und des parallelen Kompilierens auf der i7-3770 8-Thread-Maschine gemacht. Zuerst zeigen wir einen normalen Kompiliervorgang in C++Builder. Wie Sie im Screenshot sehen werden, werden nur etwa 30 % der CPU für die Kompilierung des C++-Codes verwendet.
Als Nächstes werfen wir einen Blick auf den i7-3770-Rechner, diesmal unter Verwendung von C++Builder beim parallelen Kompilieren desselben 128-Form-Projekts und etwa 254.000 Codezeilen. Wie Sie sehen werden, werden dieses Mal alle 4 Kerne und 8 Threads angesprochen und die volle Leistung der Maschine zum Kompilieren genutzt.
Sehen wir uns einige Zahlen aus dieser Maschine an, wenn wir das gleiche 128-Form-C++Builder-Projekt synchron und parallel kompilieren. Das erste Diagramm zeigt den normalen C++-Debug-Build (-O0) mit 1023 Sekunden im Vergleich zum parallelen C++-Debug-Build (-O0) mit 170 Sekunden (6-mal schneller!). Wenn wir die Zahlen auf Codezeilen pro Sekunde umrechnen, erhalten wir etwa 1494 Codezeilen pro Sekunde, wenn wir das parallele TwineCompile für -O0 verwenden. Der normale synchrone Debug -O0 Build kommt auf 248 Zeilen pro Sekunde zum Kompilieren.
Das zweite Diagramm hier zeigt den normalen C++ Release Build (-O2) mit 935 Sekunden im Vergleich zum parallelen C++ Release Build (-O2) mit 142 Sekunden (~6x schneller!). Wenn wir die Zahlen auf Codezeilen pro Sekunde umrechnen, erhalten wir etwa 1788 Codezeilen pro Sekunde, wenn wir das parallele TwineCompile für -O2 verwenden. Der normale debug-synchrone -O2-Build kommt auf 271 Zeilen pro Sekunde zum Kompilieren. Eine interessante Sache, die ich hier sehe, ist, dass auf dem AMD Ryzen 9 3950x Rechner die Debug-Builds schneller waren als die Release-Builds, während auf dem älteren Rechner hier die Debug-Builds langsam sind. Ich habe keine harten Zahlen, aber ich würde vermuten, dass dies darauf zurückzuführen ist, dass Debug-Builds größer sind als Release-Builds und daher die Geschwindigkeit der Solid-State-Festplatte ins Spiel kommt.
Wie Sie sehen können, bietet die parallele Kompilierung von C++Builder selbst auf älterer Hardware einen RIESIGEN Produktivitätsschub mit viel schnelleren Kompilierzeiten. Wenn Sie eine ältere Maschine haben und keine SSD wie die Samsung 860 EVO verwenden, ist das ein einfaches Upgrade, um eine viel bessere Leistung als mit einer normalen Festplatte zu erzielen. Oder wenn Sie eine ältere Maschine betreiben, die nicht mindestens Quad-Core ist, können Sie ältere Quad-Core-Maschinen für relativ niedrige Kosten abholen.
In jedem Fall werden Sie unabhängig von der verwendeten Hardware (solange sie mindestens 2 Kerne hat) eine deutliche Steigerung der Kompilierzeit für Ihre C++-Projekte feststellen, wenn Sie den neuesten C++Builder mit paralleler Kompilierung durch TwineCompile verwenden. In diesem Blog-Beitrag haben wir den neuesten AMD Ryzen 9 5950x mit seinen 16 Kernen und 32 Threads einem Benchmarking unterzogen und schlüssig dargelegt, dass dies einen großen Unterschied für die Steigerung Ihrer Produktivität durch Iterationsgeschwindigkeit ausmachen kann. Ein relativ großes Windows C++ Projekt mit 128 Formularen und über 254.000 Zeilen Code kann durch parallele Kompilierung mit 16 Kernen und 32 Threads in etwa 30-40 Sekunden kompiliert werden. Das ist unglaublich. Ein älterer Rechner mit normaler synchroner Kompilierung brauchte für das gleiche Projekt zwischen ~15 Minuten und ~17 Minuten!
Jetzt ist eine großartige Zeit, um als C++-Entwickler Windows- (und iOS-) Anwendungen in C++ zu erstellen. Wir haben gesehen, wie ein einzelner Kern auf älterer Hardware 60 Minuten für die Kompilierung eines C++-Projekts mit 1 Million Codezeilen benötigen konnte, was jetzt mit paralleler Kompilierung auf moderner Hardware nur noch ~2 Minuten dauert! Die parallele Kompilierung bringt dringend benötigte Produktivität in die C++-Entwicklung, ohne die Geschwindigkeit und Leistungsfähigkeit der C++-Laufzeit zu beeinträchtigen. C++Builder 10.4.1+ ist das Werkzeug, mit dem Sie dieses Ziel erreichen können.
std::tuple<float, int, long> tup {3.55, 1, 99};
auto [a, b] = tup; // gives an error
実際のコード例を見てみましょう。
#ifdef _WIN32
#include <tchar.h>
#else
typedef char _TCHAR;
#define _tmain main
#endif
#include <string>
#include <iostream>
#include <tuple>
// Demonstrate structured bindings - here, a method might in the past
// have had a bool success result, and an error param written to.
// Now, can return both (all error info) as one tuple, bound automatically
// to local vars through the auto keyword (much nicer than std::tie
// in C++11/14)
auto connect_to_network() {
// The connection could succeed, or fail with an error message
// Here, mimic it failing
bool connected{ false }; // failed!
std::string str_error{ "404: resource not found" };
return std::make_tuple(connected, str_error);
}
int _tmain(int argc, _TCHAR* argv[]) {
auto [connected, str_error] = connect_to_network();
if (!connected) {
std::cout << str_error;
}
system("pause");
return 0;
}
Mon Dec 21 2020 23:52:44 GMT+0700 (Western Indonesia Time)
Cue Player One от Baxel Data — это одна программа для кинотеатра для управления звуком, видео, освещением и аксессуарами с использованием одного списка сигналов, одного компьютера, одного оператора, и она встроена в Delphi! Семейство программного обеспечения профессионального уровня для театра Cue Player включает Cue Player Premium и Cue Player Lighting. По данным Baxel Data, их программное обеспечение используется более чем в 1000 театрах, церквях и школах по всему миру. Baxel Data также говорит, что «гораздо больше местных или общественных театральных групп нуждаются в чем-то, что они могли бы иметь на ноутбуке или портативном компьютере, которые они могли бы принести на место проведения только для выступлений». Cue Player One родился из этой потребности, говорит Баксел Дейта. Он объединяет функции звука и освещения основного программного обеспечения в одну программу и один список сигналов. Cue Player One имеет глубокую интеграцию с аппаратными средствами кинотеатра, такими как интерфейсы DMX, для управления освещением и MIDI-поверхностями.
Mon Dec 21 2020 23:50:58 GMT+0700 (Western Indonesia Time)
Cue Player One von Baxel Data ist ein Programm für Theater zur Steuerung von Ton, Video, Licht und Zubehör mit einer Cue-Liste, einem Computer, einem Bediener und es ist in Delphi gebaut! Die Cue Player Familie professioneller Software für das Theater umfasst Cue Player Premium und Cue Player Lighting. Nach Angaben von Baxel Data ist die Software in über 1000 Theatern, Kirchen und Schulen weltweit im Einsatz. Baxel Data sagt auch: „Es gibt viel mehr lokale oder kommunale Theatergruppen, die etwas brauchten, das sie auf einem Laptop oder einem tragbaren Computer haben können, den sie nur für die Aufführungen in den Veranstaltungsort mitbringen können.“ Der Cue Player One wurde aus diesem Bedürfnis heraus geboren, sagt Baxel Data. Er kombiniert die Ton- und Lichtfunktionen ihrer Mainline-Software in einem Programm und einer Cue-Liste. Cue Player One verfügt über eine tiefe Integration mit Theater-Hardware-Einheiten wie DMX-Schnittstellen zur Steuerung der Beleuchtung und einer MIDI-Oberfläche.
Mon Dec 21 2020 00:03:05 GMT+0700 (Western Indonesia Time)
Cue Player One de Baxel Data es un programa para que el teatro controle el sonido, el video, las luces y los accesorios usando una lista de cue, una computadora, un operador y está integrado en Delphi. La familia Cue Player de software de calidad profesional para teatro incluye Cue Player Premium y Cue Player Lighting. Según Baxel Data, su software se utiliza en más de 1000 teatros, iglesias y escuelas en todo el mundo. Baxel Data también dice que “hay muchos más grupos de teatro locales o comunitarios que necesitaban algo que pudieran tener en una computadora portátil o portátil que pudieran traer al lugar solo para las actuaciones“. Cue Player One nació de esta necesidad, dice Baxel Data. Combina las características de sonido e iluminación de su software principal en un programa y una lista de pistas. Cue Player One tiene una integración profunda con unidades de hardware de teatro como interfaces DMX para controlar la iluminación y superficies MIDI.
Sat Dec 19 2020 23:24:02 GMT+0700 (Western Indonesia Time)
В октябре 2020 года Embarcadero спонсировала и выпустила новую версию 6.0 форка Dev-C ++ с улучшениями, которые включали обновленный компилятор GCC 9.2.0 с поддержкой Windows 10 и C ++ 17 / C ++ 20, файлы с высоким DPI, UTF8. и улучшенные значки, и вариант темной темы. Более раннее обновление в июле включало обновление кода Dev-C ++ до Delphi 10.4.
Почему Embarcadero решила обновить Dev-C ++
Dev-C ++ был впервые выпущен в 1998 году Колином Лапласом совместно с Bloodshed Software. Новый форк Orwell Dev-C ++ был выпущен в 2011 году, но обновления прекратились в 2015 году.
Обновление Embarcadero перенесло Dev-C ++ из Delphi 7 в последнюю версию, а также представило новый, более современный интерфейс. Все эти улучшения передали перспективы более быстрой и плавной разработки Windows на C ++ и Delphi в руки разработчиков по всему миру.
В новом техническом документе Embarcadero MVP Эли М. под названием « Embarcadero Dev-C ++: Успешная модернизация популярной среды разработки Windows C ++ » прослеживаются предыстория и реализация проекта модернизации от первоначального плана до новой версии.
Планирование и реализация обновления
Обновление Dev-C ++ потребовало учета ряда факторов, начиная с вопроса о том, будет ли обновление стоить вложенных средств, и будут ли сторонние компоненты, инструменты и библиотеки доступны или должны быть заменены. Также были важны вопросы о том, насколько восприимчивой будет кодовая база к обновлению и насколько проект получит выгоду от обновления.
Переход на Dev-C ++ проходил в два этапа. На первом этапе было внесено наименьшее количество изменений, необходимых для компиляции проекта в последней версии Delphi. На втором этапе были внесены дополнительные изменения, такие как обновление компилятора, поддержка Unicode и полная поддержка Windows 10 с Embarcadero Dev-C ++ 6.0.
Кто участвовал в обновлении?
Координатором группы обновления был Embarcadero MVP с более чем 20-летним опытом, а остальные участники присоединились к проекту со всех концов США, Украины, Мексики и Новой Зеландии. В команду также входили графический дизайнер для нового дизайна интерфейса и инженер по обеспечению качества для проверки функциональности обновления.
Насколько восприимчива кодовая база к обновлению?
Команда обновления измерила гибкость кодовой базы Dev-C ++ с помощью встроенного инструмента Delphi под названием Method Toxicity Metrics. Этот инструмент присваивает оценку токсичности каждой функции, которую он сканирует, и обнаружил, что кодовая база Dev-C ++ восприимчива к обновлению.
Неполный список функций и их оценки токсичности опубликованы в техническом документе « Embarcadero Dev-C ++: Успешная модернизация популярной среды разработки Windows C ++ ».
Были ли сторонние компоненты, инструменты и библиотеки обновленными?
Наиболее важными компонентами обновления Dev-C ++ были SynEdit, основной элемент управления редактора подсветки синтаксиса; FastMM4, настраиваемый менеджер памяти; AStyle, утилита форматирования синтаксиса кода C ++; TDM-GCC 4.9.2 — это настраиваемая группа библиотек для разработки под Windows.
В техническом документе также подробно рассматривается, как команда Embarcadero оценивала эти и другие сторонние компоненты, инструменты и библиотеки с точки зрения модернизации, чтобы оценить жизнеспособность обновления Dev-C ++, и собирала воедино стороннюю установку.
Каковы были основные преимущества обновления для проекта Dev-C ++?
Поддержка стилей VCL и высокого разрешения — это лишь два из основных улучшений, которые Dev-C ++ претерпел в результате проекта модернизации. Dev-C ++ более полезен, эффективен и прост в использовании, он может идти в ногу с разработчиками и развитием C ++.
Sat Dec 19 2020 23:23:37 GMT+0700 (Western Indonesia Time)
Em outubro de 2020, a Embarcadero patrocinou e lançou uma nova versão fork 6.0 do Dev-C ++ com melhorias que incluíam um compilador GCC 9.2.0 atualizado com suporte para Windows 10 e C ++ 17 / C ++ 20, alto DPI, arquivos UTF8 e ícones aprimorados e uma opção de tema escuro. Uma atualização anterior em julho apresentou uma atualização do código Dev-C ++ para Delphi 10.4.
Por que a Embarcadero decidiu atualizar Dev-C ++
Dev-C ++ foi lançado pela primeira vez em 1998 por Colin Laplace com o Software Bloodshed. Um novo fork, Orwell Dev-C ++, foi lançado em 2011, mas as atualizações pararam em 2015.
A atualização do Embarcadero migrou o Dev-C ++ do Delphi 7 para a versão mais recente e também introduziu uma interface nova e mais moderna. Todas essas melhorias colocaram a perspectiva de um desenvolvimento mais rápido e suave do Windows em C ++ e Delphi nas mãos de desenvolvedores em todo o mundo.
Um novo white paper do Embarcadero MVP Eli M. intitulado “ Embarcadero Dev-C ++: Modernizando com sucesso um IDE do Windows C ++ popular ” traça o histórico e a implementação do projeto de modernização do plano original até a nova versão.
Planejando e implementando a atualização
A atualização do Dev-C ++ exigiu que vários fatores fossem levados em consideração, começando com a questão de saber se a atualização valeria o investimento e se componentes, ferramentas e bibliotecas de terceiros estariam disponíveis ou teriam de ser substituídos. As questões de quão receptiva a base de código seria para a atualização e quanto o próprio projeto se beneficiaria com uma atualização também foram importantes para responder.
A atualização para Dev-C ++ se desdobrou em duas etapas. O primeiro estágio envolveu fazer o mínimo de alterações necessárias para o projeto compilar na versão mais recente do Delphi. O segundo estágio envolveu mudanças complementares como atualização do compilador, suporte a Unicode e suporte total para Windows 10 com Embarcadero Dev-C ++ 6.0.
Quem esteve envolvido na atualização?
O coordenador da equipe de atualização era um Embarcadero MVP com mais de 20 anos de experiência, enquanto os membros restantes se juntaram ao projeto nos Estados Unidos, Ucrânia, México e Nova Zelândia. A equipe também incluiu um designer gráfico para o novo design de interface e um engenheiro de garantia de qualidade para verificar a funcionalidade da atualização.
Quão receptiva foi a base de código para a atualização?
A equipe de atualização mediu a maleabilidade da base de código Dev-C ++ usando uma ferramenta Delphi integrada chamada Method Toxicity Metrics. Essa ferramenta atribui uma pontuação de toxicidade a cada uma das funções que verifica e descobriu que a base de código Dev-C ++ estava receptiva à atualização.
Uma lista parcial das funções e suas pontuações de toxicidade está publicada no white paper “ Embarcadero Dev-C ++: Modernizando com sucesso um IDE do Windows C ++ popular ”.
Os componentes, ferramentas e bibliotecas de terceiros estavam atualizados?
Os componentes mais importantes na atualização Dev-C ++ foram SynEdit, o controle de editor de destaque de sintaxe central; FastMM4, um gerenciador de memória personalizado; AStyle, um utilitário de formatação de sintaxe de código C ++; e o TDM-GCC 4.9.2 é um grupo personalizado de bibliotecas para desenvolvimento do Windows.
O white paper também analisa em detalhes como a equipe da Embarcadero avaliou esses e outros componentes, ferramentas e bibliotecas de terceiros do ponto de vista da modernização para avaliar a viabilidade da atualização do Dev-C ++ e montou a configuração de terceiros.
Quais foram os principais benefícios da atualização para o projeto Dev-C ++?
Suporte para estilos VCL e alto DPI são apenas duas das principais melhorias que o Dev-C ++ sofreu como resultado do projeto de modernização. Dev-C ++ é mais útil, poderoso e fácil de usar, capaz de acompanhar os desenvolvedores e a evolução do C ++.
Sat Dec 19 2020 23:22:38 GMT+0700 (Western Indonesia Time)
En octubre de 2020, Embarcadero patrocinó y lanzó una nueva versión 6.0 de Dev-C ++ con mejoras que incluían un compilador GCC 9.2.0 actualizado con soporte para Windows 10 y C ++ 17 / C ++ 20, archivos UTF8 de alto DPI e iconos mejorados y una opción de tema oscuro. Una actualización anterior en julio incluyó una actualización del código Dev-C ++ a Delphi 10.4.
Por qué Embarcadero decidió actualizar Dev-C ++
Dev-C ++ fue lanzado por primera vez en 1998 por Colin Laplace con Bloodshed Software. En 2011 se lanzó una nueva bifurcación, Orwell Dev-C ++, pero las actualizaciones se detuvieron en 2015.
La actualización de Embarcadero migró Dev-C ++ de Delphi 7 a la última versión y también introdujo una interfaz nueva y más moderna. Todas estas mejoras colocaron la perspectiva de un desarrollo de Windows más rápido y fluido en C ++ y Delphi en manos de desarrolladores de todo el mundo.
Un nuevo documento técnico del MVP de Embarcadero, Eli M., titulado ” Embarcadero Dev-C ++: Modernización exitosa de un popular IDE de Windows C ++ ” rastrea los antecedentes y la implementación del proyecto de modernización desde el plan original hasta la nueva versión.
Planificación e implementación de la actualización
La actualización de Dev-C ++ requería que se tomaran en cuenta una serie de factores, comenzando con la pregunta de si la actualización valdría la pena la inversión y si los componentes, herramientas y bibliotecas de terceros estarían disponibles o tendrían que ser reemplazados. También era importante responder a las preguntas de cuán receptivo sería el código base a la actualización y cuánto se beneficiaría el proyecto en sí de una actualización.
La actualización a Dev-C ++ se desarrolló en dos etapas. La primera etapa implicó realizar la menor cantidad de cambios necesarios para que el proyecto se compilara en la última versión de Delphi. La segunda etapa involucró cambios complementarios como actualizar el compilador, soporte Unicode y soporte completo para Windows 10 con Embarcadero Dev-C ++ 6.0.
¿Quién participó en la actualización?
El coordinador del equipo de actualización fue un MVP de Embarcadero con más de 20 años de experiencia, mientras que los miembros restantes se unieron al proyecto de todo Estados Unidos, Ucrania, México y Nueva Zelanda. El equipo también incluyó un diseñador gráfico para el diseño de la nueva interfaz y un ingeniero de control de calidad para verificar la funcionalidad de la actualización.
¿Qué tan receptiva fue la base de código para la actualización?
El equipo de actualización midió la maleabilidad de la base de código Dev-C ++ utilizando una herramienta Delphi incorporada llamada Method Toxicity Metrics. Esta herramienta asigna una puntuación de toxicidad a cada una de las funciones que analiza, y descubrió que el código base Dev-C ++ era receptivo a la actualización.
Una lista parcial de las funciones y sus puntuaciones de toxicidad se publica en el documento técnico “ Embarcadero Dev-C ++: Modernizing Successfully a Popular Windows C ++ IDE ”.
¿Se actualizaron los componentes, las herramientas y las bibliotecas de terceros?
Los componentes más importantes en la actualización Dev-C ++ fueron SynEdit, el control del editor de resaltado de sintaxis central; FastMM4, un administrador de memoria personalizado; AStyle, una utilidad de formateo de sintaxis de código C ++; y TDM-GCC 4.9.2 es un grupo personalizado de bibliotecas para el desarrollo de Windows.
El documento técnico también analiza en detalle cómo el equipo de Embarcadero evaluó estos y otros componentes, herramientas y bibliotecas de terceros desde un punto de vista de modernización para medir la viabilidad de la actualización de Dev-C ++ y reconstruyó la configuración de terceros.
¿Cuáles fueron los principales beneficios de la actualización para el proyecto Dev-C ++?
El soporte para estilos VCL y alto DPI son solo dos de las principales mejoras que Dev-C ++ experimentó como resultado del proyecto de modernización. Dev-C ++ es más útil, potente y fácil de usar, capaz de mantenerse al día con los desarrolladores y la evolución de C ++.
Sat Dec 19 2020 23:22:15 GMT+0700 (Western Indonesia Time)
Im Oktober 2020 sponserte und veröffentlichte Embarcadero eine neue Fork-Version 6.0 von Dev-C++ mit Verbesserungen, die einen aktualisierten GCC 9.2.0-Compiler mit Unterstützung für Windows 10 und C++17/C++20, hohe DPI, UTF8-Dateien und verbesserte Icons sowie eine dunkle Theme-Option beinhalteten. Ein früheres Update im Juli beinhaltete ein Upgrade des Dev-C++-Codes auf Delphi 10.4.
Warum sich Embarcadero für ein Update von Dev-C++ entschieden hat
Dev-C++ wurde erstmals im Jahr 1998 von Colin Laplace mit Bloodshed Software veröffentlicht. Ein neuer Fork, Orwell Dev-C++, wurde 2011 veröffentlicht, aber Updates wurden 2015 eingestellt.
Das Upgrade von Embarcadero migrierte Dev-C++ von Delphi 7 auf die neueste Version und führte auch eine neue, modernere Oberfläche ein. All diese Verbesserungen gaben Entwicklern weltweit die Aussicht auf eine schnellere und reibungslosere Windows-Entwicklung in C++ und Delphi.
Ein neues Whitepaper von Embarcadero MVP Eli M. mit dem Titel „Embarcadero Dev-C++: Erfolgreiche Modernisierung einer beliebten Windows C++ IDE“ zeichnet die Hintergründe und die Umsetzung des Modernisierungsprojekts vom ursprünglichen Plan bis zum neuen Release nach.
Planung und Durchführung des Upgrades
Für das Upgrade von Dev-C++ mussten eine Reihe von Faktoren berücksichtigt werden, beginnend mit der Frage, ob sich das Upgrade lohnen würde und ob Komponenten, Tools und Bibliotheken von Drittanbietern verfügbar sein würden oder ersetzt werden müssten. Die Fragen, wie empfänglich die Codebasis für das Upgrade sein würde und wie sehr das Projekt selbst von einem Upgrade profitieren würde, waren ebenfalls wichtig zu beantworten.
Das Upgrade auf Dev-C++ verlief in zwei Stufen. In der ersten Phase wurden so wenige Änderungen wie möglich vorgenommen, damit das Projekt in der neuesten Version von Delphi kompiliert werden konnte. Die zweite Stufe umfasste ergänzende Änderungen wie die Aktualisierung des Compilers, Unicode-Unterstützung und volle Unterstützung für Windows 10 mit Embarcadero Dev-C++ 6.0.
Wer war an dem Upgrade beteiligt?
Der Koordinator des Upgrade-Teams war ein Embarcadero MVP mit über 20 Jahren Erfahrung, während die übrigen Mitglieder aus den USA, der Ukraine, Mexiko und Neuseeland zum Projekt stießen. Zum Team gehörten auch ein Grafikdesigner für das neue Oberflächendesign und ein Qualitätssicherungsingenieur, der die Funktionalität des Upgrades überprüfte.
Wie empfindlich war die Codebasis für das Upgrade?
Das Upgrade-Team hat die Anpassungsfähigkeit der Dev-C++-Codebasis mit einem integrierten Delphi-Tool namens Method Toxicity Metrics gemessen. Dieses Tool ordnet jeder der gescannten Funktionen einen Toxizitätswert zu und stellte fest, dass die Dev-C++-Codebasis für das Upgrade empfänglich war.
Eine unvollständige Liste der Funktionen und ihrer Toxizitätswerte ist im Whitepaper „Embarcadero Dev-C++: Successfully Modernizing a Popular Windows C++ IDE“ veröffentlicht.
Waren Komponenten, Tools und Bibliotheken von Drittanbietern auf dem neuesten Stand?
Die wichtigsten Komponenten des Dev-C++-Upgrades waren SynEdit, das zentrale Syntax-Highlighting-Editor-Steuerelement, FastMM4, ein benutzerdefinierter Speichermanager, AStyle, ein Dienstprogramm zur Syntaxformatierung von C++-Code, und TDM-GCC 4.9.2, eine benutzerdefinierte Gruppe von Bibliotheken für die Windows-Entwicklung.
Im Whitepaper wird auch detailliert beschrieben, wie das Embarcadero-Team diese und andere Komponenten, Tools und Bibliotheken von Drittanbietern unter Modernisierungsgesichtspunkten evaluiert hat, um die Durchführbarkeit des Dev-C++-Upgrades abzuschätzen, und wie es das Setup der Drittanbieter zusammenstellte.
Was waren die Hauptvorteile des Upgrades für das Dev-C++ Projekt?
Die Unterstützung für VCL-Stile und High-DPI sind nur zwei der wichtigsten Verbesserungen, die Dev-C++ als Ergebnis des Modernisierungsprojekts erfahren hat. Dev-C++ ist nützlicher, leistungsfähiger und benutzerfreundlicher und kann mit den Entwicklern und der Entwicklung von C++ mithalten.
Sat Dec 19 2020 23:21:56 GMT+0700 (Western Indonesia Time)
Несколько недель назад мы выпустили « патч для платформ Apple », направленный на улучшение нашей поддержки последних версий macOS и iOS. Хотя патч решает проблемы с импортом Apple SDK и отладкой на устройствах, все еще оставались некоторые проблемы с привязкой определенных библиотек (например, ClientDataSet) и для разработки на C ++ iOS.
Мы выпустили обновленную версию того же патча (через менеджер пакетов GetIt и вскоре через портал загрузки my.embarcadero.com ). Мы также удалили старый патч, так как новый патч включает и заменяет старый. Если вы уже установили первый патч, просто установите новый поверх него. Если нет, то все, что вам нужно, это установить «декабрьский патч». Обратите внимание, что страница приветствия должна уведомить вас о новом патче и что при открытии диспетчера пакетов GetIt вы должны увидеть оба исправления — это потому, что GetIt перечисляет все пакеты, уже установленные в вашей системе, независимо от их доступности, так как это будет единственный способ удалить такой пакет. Однако нет необходимости удалять старый патч.
Ниже представлена копия файла readme нового патча с более подробной информацией о старых и новых устраненных проблемах.
Декабрьский патч платформ Apple для RAD Studio 10.4.1 Readme
Этот патч устраняет несколько проблем, связанных с поддержкой RAD Studio 10.4.1 для XCode 12, iOS 14 и macOS Big Sur, которые не были доступны при поставке 10.4.1. Подобный патч мы выпустили в ноябре. Этот новый патч заменяет предыдущий и предлагает дальнейшие улучшения в той же области. Установка этого исправления поверх существующего исправления заменит все необходимые файлы.
В предыдущую версию этого патча (выпущенного в ноябре 2020 года) мы включили:
* Исправление RTL для проблемы с исключениями, также вызывающей проблемы при завершении работы приложения, для приложений macOS, работающих на недавно выпущенной macOS 11.0 Big Sur. Соответствующая публичная проблема была зарегистрирована на портале качества как RSP-30000. Для решения этой проблемы исправление включает измененный исходный код и скомпилированные двоичные файлы.
* Новая версия PAServer для macOS и включает исправления для нескольких проблем:
* Импорт SDK из Xcode 12
* Отладка приложений на устройстве iOS 14
* Сюда входят отчеты портала качества, такие как RSP-30806, RSP-31014, RSP-31667 и РСП-31049.
Эта версия патча включает вышеупомянутые исправления, но добавляет несколько новых исправлений:
* Проблема при компиляции с использованием компонента ClientDataSet (RSP-31795)
* Несколько проблем с использованием C ++ с iOS14 SDK:
* Ошибка ‘неизвестное имя типа __UINTPTR_TYPE__’ при сборке с iOS14
* Ошибки при создании с помощью iOS14 SDK, включая «недопустимый узел: это может быть результатом использования итератора карты в качестве итератора последовательности или наоборот» или ошибки компоновщика (RSP-31014)
* Ошибки компоновщика, относящиеся к DBX, такие как ‘[ld Error] Ошибка: «__ZdlPv», ссылка на которую имеется: __ZN9DBXObjectD0Ev в DBXCommon.o’
Sat Dec 19 2020 23:21:33 GMT+0700 (Western Indonesia Time)
Algumas semanas atrás, lançamos um “ patch das plataformas Apple ” com foco em melhorar nosso suporte para as versões mais recentes do macOS e iOS. Embora o patch resolva problemas com a importação de SDKs da Apple e com a depuração em dispositivos, ainda havia alguns problemas com a vinculação de bibliotecas específicas (como a ClientDataSet) e para o desenvolvimento C ++ iOS.
Acabamos de lançar uma versão atualizada do mesmo patch (via gerenciador de pacotes GetIt e em breve via portal de download my.embarcadero.com ). Também retiramos o patch antigo, pois o novo patch inclui e substitui o antigo. Se você já instalou o primeiro patch, basta instalar este novo sobre ele. Caso contrário, tudo o que você precisa é instalar o “patch de dezembro”. Observe que a página de boas-vindas deve notificá-lo sobre o novo patch e que quando você abre o gerenciador de pacotes GetIt, você deve ver os dois patches – isto é porque GetIt lista qualquer pacote já instalado em seu sistema independentemente de sua disponibilidade, pois este será o único maneira de desinstalar esse pacote. Não há necessidade de desinstalar o patch antigo.
Abaixo está uma cópia do readme do novo patch, com informações mais detalhadas sobre os problemas antigos e novos abordados.
Atualização de plataformas Apple de dezembro para o Leiame do RAD Studio 10.4.1
Este patch resolve alguns problemas relacionados ao suporte do RAD Studio 10.4.1 para XCode 12, iOS 14 e macOS Big Sur, que não estavam disponíveis quando o 10.4.1 foi enviado. Emitimos um patch semelhante em novembro. Este novo patch substitui o patch anterior e oferece mais melhorias na mesma área. Instalar este patch sobre o patch existente substituirá todos os arquivos necessários.
Na versão anterior deste patch (lançado em novembro de 2020), incluímos:
* Uma correção RTL para um problema com exceções, que também causava problemas no encerramento do aplicativo, para aplicativos macOS em execução no macOS 11.0 Big Sur lançado recentemente. O problema público correspondente foi registrado no Portal da Qualidade como RSP-30000. Para esse problema, o patch inclui código-fonte modificado e arquivos binários compilados.
* Uma nova versão do PAServer para macOS e inclui correções para vários problemas:
* Importação do SDK do Xcode 12
* Aplicativos de depuração em um dispositivo iOS 14
* Inclui relatórios do Portal de qualidade, como RSP-30806, RSP-31014, RSP-31667 e RSP-31049.
Esta versão do patch inclui as correções acima, mas adiciona várias novas correções:
* Um problema de compilação com o componente ClientDataSet (RSP-31795)
* Vários problemas usando C ++ com o iOS14 SDK:
* Erro ‘nome de tipo desconhecido __UINTPTR_TYPE__’ ao compilar com iOS14
* Erros de construção com o iOS14 SDK, incluindo ‘nó inválido: isso pode resultar do uso de um iterador de mapa como um iterador de sequência, ou vice-versa’ ou um erro de vinculador (RSP-31014)
* Erros de vinculador referentes a DBX, como ‘[Erro ld] Erro: “__ZdlPv”, referenciado de: __ZN9DBXObjectD0Ev em DBXCommon.o’
Sat Dec 19 2020 23:20:52 GMT+0700 (Western Indonesia Time)
Hace unas semanas, lanzamos un ” parche de plataformas de Apple ” centrado en mejorar nuestro soporte para las últimas versiones de macOS e iOS. Si bien el parche resuelve problemas con la importación de SDK de Apple y con la depuración en dispositivos, todavía había algunos problemas con el enlace de bibliotecas específicas (como ClientDataSet) y para el desarrollo de C ++ iOS.
Ahora hemos lanzado una versión actualizada del mismo parche (a través del administrador de paquetes GetIt y pronto a través del portal de descargas my.embarcadero.com ). También hemos retirado el parche anterior, ya que el nuevo parche incluye y reemplaza al anterior. Si ya ha instalado el primer parche, simplemente instale este nuevo encima. Si no es así, todo lo que necesita es instalar el “parche de diciembre”. Tenga en cuenta que la página de bienvenida debe notificarle sobre el nuevo parche y que cuando abra el administrador de paquetes GetIt debería ver ambos parches; esto se debe a que GetIt enumera cualquier paquete ya instalado en su sistema independientemente de su disponibilidad, ya que este será el único forma de desinstalar dicho paquete. Sin embargo, no es necesario desinstalar el parche anterior.
A continuación, se muestra una copia del archivo Léame del nuevo parche, con información más detallada sobre los problemas antiguos y nuevos abordados.
Parche de Apple Platforms de diciembre para RAD Studio 10.4.1 Readme
Este parche aborda algunos problemas relacionados con la compatibilidad de RAD Studio 10.4.1 para XCode 12, iOS 14 y macOS Big Sur, que no estaban disponibles cuando se envió 10.4.1. Publicamos un parche similar en noviembre. Este nuevo parche reemplaza al anterior y ofrece más mejoras en la misma área. La instalación de este parche sobre el parche existente reemplazará todos los archivos necesarios.
En la versión anterior de este parche (lanzado en noviembre de 2020), incluimos:
* Una solución RTL para un problema con excepciones, que también causa problemas al finalizar la aplicación, para aplicaciones macOS que se ejecutan en macOS 11.0 Big Sur recientemente lanzado. El problema público correspondiente se registró en Quality Portal como RSP-30000. Para este problema, el parche incluye código fuente modificado y archivos binarios compilados.
* Una nueva versión de PAServer para macOS, e incluye correcciones para varios problemas:
* Importación de SDK desde Xcode 12
* Aplicaciones de depuración en un dispositivo iOS 14
* Esto incluye informes de Quality Portal como RSP-30806, RSP-31014, RSP-31667 y RSP-31049.
Esta versión del parche incluye las correcciones anteriores, pero agrega varias correcciones nuevas:
* Un problema de compilación contra el componente ClientDataSet (RSP-31795)
* Varios problemas al usar C ++ con el SDK de iOS14:
* Error ‘nombre de tipo desconocido __UINTPTR_TYPE__’ al compilar con iOS14
* Errores de compilación con el SDK de iOS14, incluido ‘nodo no válido: esto puede resultar del uso de un iterador de mapa como iterador de secuencia, o viceversa’ o un error del vinculador (RSP-31014)
* Errores del vinculador que se refieren a DBX, como ‘[Error de ld] Error: “__ZdlPv”, referenciado desde: __ZN9DBXObjectD0Ev en DBXCommon.o’
Sat Dec 19 2020 23:20:22 GMT+0700 (Western Indonesia Time)
Vor ein paar Wochen haben wir einen „Apple-Plattformen-Patch“ veröffentlicht, der sich auf die Verbesserung unserer Unterstützung für die neuesten Versionen von macOS und iOS konzentriert. Während der Patch Probleme mit dem Import von Apple SDKs und mit dem Debugging auf Geräten behebt, gab es immer noch einige Probleme mit dem Binden spezifischer Bibliotheken (wie der von ClientDataSet) und für die C++ iOS-Entwicklung.
Wir haben nun eine aktualisierte Version desselben Patches veröffentlicht (über den GetIt-Paketmanager und bald auch über das Download-Portal my.embarcadero.com). Wir haben auch den älteren Patch zurückgezogen, da der neue Patch den alten beinhaltet und ersetzt. Wenn Sie den ersten Patch bereits installiert haben, installieren Sie einfach diesen neuen darüber. Wenn nicht, brauchen Sie nur den „Dezember-Patch“ zu installieren. Beachten Sie, dass die Willkommensseite Sie auf den neuen Patch hinweisen sollte und dass Sie beim Öffnen des GetIt-Paketmanagers beide Patches sehen sollten — das liegt daran, dass GetIt jedes Paket auflistet, das bereits auf Ihrem System installiert ist, unabhängig von seiner Verfügbarkeit, da dies die einzige Möglichkeit ist, ein solches Paket zu deinstallieren. Es besteht jedoch keine Notwendigkeit, den alten Patch zu deinstallieren.
Unten finden Sie eine Kopie der Readme des neuen Patches, mit detaillierteren Informationen zu den alten und neuen Problemen, die behoben wurden.
Dezember Apple Plattformen Patch für RAD Studio 10.4.1 Readme
Dieser Patch behebt einige Probleme im Zusammenhang mit der Unterstützung von RAD Studio 10.4.1 für XCode 12, iOS 14 und macOS Big Sur, die bei der Auslieferung von 10.4.1 noch nicht verfügbar waren. Wir haben einen ähnlichen Patch im November veröffentlicht. Dieser neue Patch ersetzt den vorherigen Patch und bietet weitere Verbesserungen in demselben Bereich. Wenn Sie diesen Patch über den bestehenden Patch installieren, werden alle erforderlichen Dateien ersetzt.
In der vorherigen Version dieses Patches (veröffentlicht im November 2020) waren enthalten:
* Einen RTL-Fix für ein Problem mit Ausnahmen, das auch Probleme beim Beenden von Apps für macOS-Anwendungen verursacht, die auf dem kürzlich veröffentlichten macOS 11.0 Big Sur laufen. Das entsprechende öffentliche Problem wurde im Quality Portal als RSP-30000 protokolliert. Für dieses Problem enthält der Patch modifizierten Quellcode und kompilierte Binärdateien.
* Eine neue Version von PAServer für macOS, die Korrekturen für mehrere Probleme enthält:
* SDK-Import aus Xcode 12
* Debugging von Anwendungen auf einem iOS 14-Gerät
* Dies beinhaltet Quality Portal Berichte wie RSP-30806, RSP-31014, RSP-31667 und RSP-31049.
Diese Version des Patches enthält die oben genannten Korrekturen, fügt aber mehrere neue Korrekturen hinzu:
* Ein Problem bei der Kompilierung mit der ClientDataSet-Komponente (RSP-31795)
* Mehrere Probleme bei der Verwendung von C++ mit dem iOS14 SDK:
* Fehler ‚unbekannter Typname __UINTPTR_TYPE__‘ beim Bauen mit iOS14
* Fehler bei der Erstellung mit dem iOS14 SDK, einschließlich ‚ungültiger Knoten: dies kann aus der Verwendung eines Map-Iterators als Sequenz-Iterator oder umgekehrt resultieren‘ oder ein Linker-Fehler (RSP-31014)
* Linker-Fehler, die sich auf DBX beziehen, wie z.B. ‚[ld Error] Error: „__ZdlPv“, referenziert von: __ZN9DBXObjectD0Ev in DBXCommon.o‘
Fri Dec 18 2020 03:00:01 GMT+0700 (Western Indonesia Time)
2020年11月にmacOSとiOSの最新バージョンのサポートを改善することにフォーカスした「RAD Studio 10.4.1向けPatch: Appleプラットフォームの修正」をリリースしましたが、今回は同じパッチの更新版です。このパッチでは、既に修正したAppleSDKのインポートとデバイスでのデバッグに関する問題に加えて、特定のライブラリ(例えば、TClientDataSet)のバインディングやiOSのC++開発に関する問題などを解決しています。
このパッチでは、10.4.1のリリース時に間に合わなかったXcode 12、iOS 14、macOS 11 Big Sur (Intel)のサポートに関連するいくつかの問題に対処しています。11月に同様のパッチをリリースしました。この新しいパッチは、その以前のパッチを置き換えるもので、同じエリアでさらなる改善を提供しています。既存のパッチの上にこのパッチをインストールすることで、必要なファイルはすべて置き換えられます。
以前のバッチ(2020年11月にリリース)には、以下の内容が含まれていました。
macOS 11 Big Sur(Intel)上で実行するアプリの例外送出時、ならびにアプリの終了時の問題(RSP-30000)
An issue compiling against the ClientDataSet component (RSP-31795)
Several issues using C++ with the iOS14 SDK:
Error ‘unknown type name __UINTPTR_TYPE__’ when building with iOS14 (詳しくは、こちらを参照ください)
Errors building with the iOS14 SDK, including ‘invalid node: this may result from using a map iterator as a sequence iterator, or vice-versa’ or a linker error (RSP-31014)
Linker errors referring to DBX, such as ‘[ld Error] Error: “__ZdlPv”, referenced from: __ZN9DBXObjectD0Ev in DBXCommon.o’
Thu Dec 17 2020 23:20:03 GMT+0700 (Western Indonesia Time)
AlignMix — это простое в использовании решение для картографирования территории продаж, построенное на Delphi. По словам Стива из AlignMix, «это географическая информационная система, которая помогает компаниям проектировать территории продаж и управлять ими для своих торговых представителей. Она позволяет пользователю легко перемещать границы территорий и повторно назначать почтовые индексы (или почтовые индексы), чтобы сделать территории справедливый и сбалансированный «. Кроме того, он говорит: «AlignMix крутой, потому что он настолько прост в использовании. Мы сосредоточились на том, чтобы предоставить пользователю наилучший пользовательский опыт. Несмотря на то, что проектирование территорий продаж обычно не считается легкой и приятной задачей, мы получаем отзывы от пользователей. говоря, что им просто нравится играть с AlignMix ». Это настольное приложение для Windows, но оно также предназначено для работы с сенсорными экранами. Разработанный с помощью Delphi и VCL, он интенсивно использует библиотеку параллельного программирования и общие коллекции. Он также использует панели DevExpress (лента) и редактирования, компоненты TMS, TMS FlexCel, TChart Professional, вкладки Google Chrome, OnGuard и EurekaLog.
Thu Dec 17 2020 23:19:46 GMT+0700 (Western Indonesia Time)
AlignMix é uma solução de mapeamento de território de vendas fácil de usar e é construída em Delphi. De acordo com Steve da AlignMix, “é um Sistema de Informação Geográfica que ajuda as empresas a projetar e gerenciar territórios de vendas para sua força de vendas. Ele permite ao usuário mover facilmente os limites do território e reatribuir CEPs (ou códigos postais) para fazer os territórios justo e equilibrado. ” Além disso, ele diz “AlignMix é legal porque é tão fácil de usar. Nosso foco é fornecer ao usuário a melhor experiência possível. Embora projetar territórios de vendas não seja normalmente considerado uma tarefa fácil e agradável, estamos recebendo feedback dos usuários dizendo que adoram brincar com o AlignMix. ” É um aplicativo da área de trabalho do Windows, mas também foi projetado para funcionar com telas sensíveis ao toque. Desenvolvido com Delphi e VCL, faz uso intensivo da Biblioteca de Programação Paralela e coleções de Genéricos. Ele também usa DevExpress Bars (Ribbon) e Edits, TMS Components, TMS FlexCel, TChart Professional, Google Chrome Tabs, OnGuard e EurekaLog.
Thu Dec 17 2020 23:19:13 GMT+0700 (Western Indonesia Time)
AlignMix es una solución de mapeo de territorios de ventas fácil de usar y está construida en Delphi. Según Steve de AlignMix, “es un sistema de información geográfica que ayuda a las empresas a diseñar y administrar territorios de ventas para su fuerza de ventas. Permite al usuario mover fácilmente los límites del territorio y reasignar códigos postales (o códigos postales) para hacer los territorios justo y equilibrado “. Además, dice: “AlignMix es genial porque es muy fácil de usar. Nos hemos centrado en brindar al usuario la mejor experiencia de usuario posible. Aunque diseñar territorios de ventas normalmente no se considera una tarea fácil y agradable, estamos recibiendo comentarios de los usuarios diciendo que les encanta jugar con AlignMix “. Es una aplicación de escritorio de Windows, pero también está diseñada para funcionar con pantallas táctiles. Desarrollado con Delphi y VCL, hace un uso intensivo de la biblioteca de programación paralela y las colecciones genéricas. También utiliza DevExpress Bars (Ribbon) y Edits, TMS Components, TMS FlexCel, TChart Professional, Google Chrome Tabs, OnGuard y EurekaLog.
Thu Dec 17 2020 23:18:52 GMT+0700 (Western Indonesia Time)
AlignMix ist eine einfach zu bedienende Lösung zur Kartierung von Vertriebsgebieten und wurde in Delphi entwickelt. Laut Steve von AlignMix „handelt es sich um ein geografisches Informationssystem, das Unternehmen bei der Gestaltung und Verwaltung von Vertriebsgebieten für ihre Vertriebsmitarbeiter unterstützt. Es ermöglicht dem Benutzer, die Gebietsgrenzen einfach zu verschieben und Postleitzahlen neu zuzuordnen, um die Gebiete fair und ausgewogen zu gestalten.“ Außerdem sagt er: „AlignMix ist cool, weil es so einfach zu bedienen ist. Wir haben uns darauf konzentriert, dem Benutzer die bestmögliche Benutzererfahrung zu bieten. Obwohl das Entwerfen von Vertriebsgebieten normalerweise nicht als eine einfache und angenehme Aufgabe angesehen wird, bekommen wir Feedback von Anwendern, die sagen, dass sie es einfach lieben, mit AlignMix zu spielen.“ Es handelt sich um eine Windows-Desktop-App, die aber auch für die Arbeit mit Touchscreens ausgelegt ist. Sie wurde mit Delphi und der VCL entwickelt und macht großen Gebrauch von der Parallel Programming Library und den Generic Collections. Es verwendet auch DevExpress Bars (Ribbon) und Edits, TMS Components, TMS FlexCel, TChart Professional, Google Chrome Tabs, OnGuard und EurekaLog.
constexpr float x = 42.0;
constexpr float y{108};
constexpr float z = exp(5, 3);
constexpr int i; // Error! Not initialized
int j = 0;
constexpr int k = j + 1; //Error! j not a constant expression
Wed Dec 16 2020 23:18:36 GMT+0700 (Western Indonesia Time)
iCrew — это приложение для iOS и Android, которое было создано для предоставления информации о доступности экипажей спасательных шлюпок волонтерам и построено на Delphi. Согласно описанию приложения «Приложение позволяет членам экипажа записывать себя как недоступные, например, если им нужно покинуть зону, и бронировать обратно, когда они возвращаются одним нажатием кнопки. Доступность мгновенно обновляется для всех телефоны других членов экипажа, так что в любое время можно легко увидеть, кто будет доступен, если экипаж получит вызов «. Приложение для Android доступно в магазине Google Play, а версия для iOS доступна в магазине Apple. Похоже, что Delphi FireMonkey использовался для создания кроссплатформенного приложения, предоставляющего версии как для iOS, так и для Android. Приложение отлично выглядит!
Wed Dec 16 2020 23:18:20 GMT+0700 (Western Indonesia Time)
iCrew é um aplicativo iOS e Android que foi criado para fornecer informações sobre a disponibilidade de tripulações de salva-vidas de voluntários e é construído em Delphi. De acordo com a descrição do app “O app permite que os membros da tripulação se reservem como indisponíveis, por exemplo, se precisarem sair da área, e reservem quando retornarem com o toque de um botão. A disponibilidade é atualizada instantaneamente em todos outros membros da tripulação telefonam para que seja fácil ver a qualquer momento quem está disponível caso a tripulação receba uma chamada. ” O aplicativo Android está disponível na loja Google Play e a versão iOS está disponível na loja Apple. Parece que Delphi FireMonkey foi usado para criar um aplicativo de plataforma cruzada fornecendo versões para iOS e Android. O aplicativo parece ótimo!
Wed Dec 16 2020 23:17:31 GMT+0700 (Western Indonesia Time)
iCrew es una aplicación para iOS y Android que se creó para proporcionar información sobre la disponibilidad de las tripulaciones de los botes salvavidas voluntarios y está construida en Delphi. Según la descripción de la aplicación, “la aplicación permite a los miembros de la tripulación reservarse ellos mismos como no disponibles, por ejemplo, si necesitan salir del área, y volver a reservar cuando regresen con solo tocar un botón. La disponibilidad se actualiza instantáneamente en todos otros miembros de la tripulación llaman por teléfono para que sea fácil ver en cualquier momento quién está disponible en caso de que la tripulación tenga una llamada “. La aplicación de Android está disponible en la tienda de Google Play y la versión de iOS está disponible en la tienda de Apple. Parece que Delphi FireMonkey se utilizó para crear una aplicación multiplataforma que proporciona versiones de iOS y Android. ¡La aplicación se ve genial!
Wed Dec 16 2020 23:17:09 GMT+0700 (Western Indonesia Time)
iCrew ist eine iOS- und Android-App, die erstellt wurde, um Informationen über die Verfügbarkeit von freiwilligen Rettungsbootbesatzungen bereitzustellen, und sie wurde in Delphi entwickelt. In der Beschreibung der App heißt es: „Die App ermöglicht es Besatzungsmitgliedern, sich selbst als nicht verfügbar zu buchen, wenn sie z. B. das Gebiet verlassen müssen, und sich bei ihrer Rückkehr mit einem Knopfdruck wieder anzumelden. Die Verfügbarkeit wird sofort auf allen Telefonen der anderen Crew-Mitglieder aktualisiert, so dass man jederzeit sehen kann, wer verfügbar ist, falls die Crew einen Einsatz hat.“ Die Android-App ist im Google Play Store und die iOS-Version im Apple Store erhältlich. Es scheint, dass Delphi FireMonkey verwendet wurde, um eine plattformübergreifende App zu erstellen, die sowohl iOS- als auch Android-Versionen bietet. Die App sieht toll aus!
AgileBits社のStefan van As氏とMark Eaton氏は、1PasswordのWiondows版で使用しているサードパーティコンポーネントの情報を寄せてくれました。すべてのDelphi開発者が利用可能なサードパーティコンポーネントの巨大なエコシステムから、実に多様なコンポーネントが活用されていることは本当に驚くべきことです。Delphi開発者のエコシステムは、それが強力な開発ツールであり続けることの重要な要素のひとつです。
Tue Dec 15 2020 23:16:53 GMT+0700 (Western Indonesia Time)
TwineCompile — это надстройка для C ++ Builder, которая в настоящее время находится в GetIt бесплатно, чтобы обновлять подписчиков для всех выпусков, включая Pro. Посмотрим, насколько хорошо это работает с реальными проектами.
TwineCompile значительно ускоряет время компиляции C ++ Builder. Чтобы проверить это, мы получили две большие библиотеки C ++ с открытым исходным кодом, которые собираются с помощью C ++ Builder: Xerces и SDL 2 . Xerces — это библиотека XML, а SDL — очень известная библиотека окон и ввода с открытым исходным кодом, часто используемая для игр. Они оба являются отличными тестовыми примерами, поскольку представляют собой большие кодовые базы C ++ приличного размера.
В среде IDE, без TwineCompile, сборка Xerces заняла 5 минут 19 секунд. С TwineCompile Xerces занял 51 секунду. Это 6-кратное ускорение
В среде IDE без TwineCompile для сборки SDL 2 потребовалось 2 минуты 10 секунд. С TwineCompile SDL 2 занял 21 секунду. Это ускорение в 6,2 раза
Довольно хорошие результаты! Представьте себе, что время сборки вашего собственного проекта C ++ увеличилось на столько — в шесть раз. Это примерно соответствует количеству ядер ЦП.
Детали:
Эти результаты были получены на более старом процессоре Intel i7-3930K (6 ядер с гиперпоточностью) с 16 ГБ ОЗУ на SSD-диске Samsung XP941 M.2 PCIe.
Прирост производительности в основном связан с количеством доступных ядер. Мы ожидаем, что в чистой сборке вы увидите примерно 4-кратное увеличение с 4-ядерным процессором или 12-кратное ускорение с 12-ядерным процессором. Однако TwineCompile также реализует кэширование и предлагает другие методы, которые помогают в других сценариях (например, создание, а не чистая сборка или машины с более ограниченными ресурсами), так что Make может быть еще быстрее. Иногда мы упоминаем 50-кратное ускорение, которое может быть достигнуто в некоторых сценариях — очень впечатляюще.
Вы можете найти TwineCompile в GetIt сегодня в разделе «Плагины IDE». Это бесплатно для Professional, а также для Architect / Enterprise, если у вас есть активная подписка на обновления (это новинка, она не всегда была доступна для Pro, но теперь доступна).
Рекомендую скачать! Мы очень хотим узнать, как это влияет на ваш проект.
Tue Dec 15 2020 23:16:39 GMT+0700 (Western Indonesia Time)
TwineCompile é um addon para C ++ Builder que está atualmente no GetIt gratuitamente para atualizar clientes assinantes, para todas as edições, incluindo Pro. Vamos ver como funciona bem com projetos do mundo real.
TwineCompile acelera significativamente o tempo de compilação do C ++ Builder. Para testar isso, temos duas grandes bibliotecas C ++ de código aberto que são compiladas com o C ++ Builder: Xerces e SDL 2 . Xerces é uma biblioteca XML e SDL uma biblioteca de janelas e entradas de código aberto muito conhecida, frequentemente usada para jogos. Ambos são excelentes casos de teste, uma vez que têm bases de código C ++ grandes e decentes.
No IDE, sem TwineCompile, o Xerces levou 5 minutos e 19 segundos para ser construído. Com TwineCompile, o Xerces levou 51 segundos. Isso é um aumento de 6x
In-IDE, sem TwineCompile, SDL 2 levou 2 minutos e 10 segundos para construir. Com TwineCompile, SDL 2 levou 21 segundos. Isso é um aumento de 6,2x
Resultados muito bons! Imagine acelerar o tempo de construção do seu próprio projeto C ++ em muito – seis vezes mais rápido. Isso aumenta aproximadamente com o número de núcleos da CPU.
Detalhes:
Esses resultados foram gerados em um processador Intel i7-3930K mais antigo (6 núcleos com hyperthreading) com 16 GB de RAM, em um disco SSD Samsung XP941 M.2 PCIe.
O ganho de desempenho se deve principalmente ao número de núcleos disponíveis. Esperamos que você veja, em uma construção limpa, aproximadamente um ganho de 4x com um CPU de 4 núcleos, ou um aumento de velocidade de 12x com um CPU de 12 núcleos. No entanto, TwineCompile também implementa cache e tem outras técnicas que ajudam em outros cenários (ou seja, make, não uma compilação limpa ou máquinas com mais recursos limitados) para que um Make possa ser ainda mais rápido. Há um aumento de 50x que às vezes citamos, que pode ser alcançado em alguns cenários – muito impressionante.
Você pode encontrar TwineCompile no GetIt hoje, na seção ‘Plugins IDE’. É gratuito para o Professional, assim como para o Architect / Enterprise, se você tiver uma assinatura de atualização ativa (isso é novo, nem sempre estava disponível para o Pro, mas agora está).
Eu recomendo que você baixe! Estamos ansiosos para saber a diferença que isso faz no seu projeto.
Tue Dec 15 2020 23:16:07 GMT+0700 (Western Indonesia Time)
TwineCompile es un complemento para C ++ Builder que se encuentra actualmente en GetIt de forma gratuita para actualizar a los clientes de suscripción, para todas las ediciones, incluida la Pro. Veamos qué tan bien funciona con proyectos del mundo real.
TwineCompile acelera significativamente el tiempo de compilación de C ++ Builder. Para probar esto, obtuvimos dos grandes bibliotecas de C ++ de código abierto que se compilan con C ++ Builder: Xerces y SDL 2 . Xerces es una biblioteca XML y SDL una biblioteca de entrada y ventanas de código abierto muy conocida, que se utiliza a menudo para juegos. Ambos son excelentes casos de prueba, ya que son bases de código C ++ grandes de tamaño decente.
En IDE, sin TwineCompile, Xerces tardó 5 minutos y 19 segundos en compilarse. Con TwineCompile, Xerces tardó 51 segundos. Eso es una aceleración 6x
En IDE, sin TwineCompile, SDL 2 tardó 2 minutos y 10 segundos en compilarse. Con TwineCompile, SDL 2 tardó 21 segundos. Eso es una aceleración de 6.2x
¡Muy buenos resultados! Imagínese acelerar los tiempos de construcción de su propio proyecto C ++ en esa cantidad, seis veces más rápido. Esto escala aproximadamente con la cantidad de núcleos de CPU.
Detalles:
Estos resultados se generaron en un procesador Intel i7-3930K más antiguo (6 núcleos con hyperthreading) con 16 GB de RAM, en un disco SSD Samsung XP941 M.2 PCIe.
La ganancia de rendimiento se debe principalmente a la cantidad de núcleos disponibles. Esperamos que vea, en una construcción limpia, aproximadamente una ganancia de 4x con una CPU de 4 núcleos, o una aceleración de 12x con una CPU de 12 núcleos. Sin embargo, TwineCompile también implementa el almacenamiento en caché y tiene otras técnicas que ayudan en otros escenarios (es decir, hacer, no una construcción limpia, o más máquinas con recursos limitados) para que Make pueda ser aún más rápido. Hay una aceleración de 50x que a veces citamos que se puede lograr en algunos escenarios, muy impresionante.
Puede encontrar TwineCompile en GetIt hoy, en la sección ‘Complementos IDE’. Es gratis para Professional y Architect / Enterprise si tiene una suscripción de actualización activa (esto es nuevo, no siempre estuvo disponible para Pro, pero ahora lo está).
¡Te recomiendo que descargues! Estamos ansiosos por escuchar la diferencia que hace en su proyecto.
Tue Dec 15 2020 23:15:53 GMT+0700 (Western Indonesia Time)
TwineCompile ist ein Addon für C++Builder, das derzeit in GetIt für Update-Abonnement-Kunden kostenlos zur Verfügung steht, für alle Editionen, einschließlich Pro. Schauen wir uns an, wie gut es mit realen Projekten funktioniert.
TwineCompile beschleunigt die Kompilierzeit von C++Builder erheblich. Um dies zu testen, haben wir zwei große Open-Source-C++-Bibliotheken, die sich mit C++Builder kompilieren lassen: Xerces und SDL 2. Xerces ist eine XML-Bibliothek, und SDL eine sehr bekannte Open-Source-Fenster- und Eingabebibliothek, die oft für Spiele verwendet wird. Beide sind großartige Testfälle, da es sich um große C++-Codebasen von annehmbarer Größe handelt.
In-IDE, ohne TwineCompile, benötigte Xerces 5 Minuten und 19 Sekunden zum Erstellen. Mit TwineCompile benötigte Xerces 51 Sekunden. Das ist eine 6-fache Beschleunigung
In-IDE, ohne TwineCompile, benötigte SDL 2 2 Minuten und 10 Sekunden für die Erstellung. Mit TwineCompile benötigte SDL 2 21 Sekunden. Das ist eine 6,2-fache Beschleunigung.
Ziemlich gute Ergebnisse! Stellen Sie sich vor, Sie könnten die Erstellungszeit Ihres eigenen C++-Projekts um so viel beschleunigen – sechsmal so schnell. Dies skaliert in etwa mit der Anzahl der CPU-Kerne.
Details:
Diese Ergebnisse wurden auf einem älteren Intel i7-3930K-Prozessor (6 Kerne mit Hyperthreading) mit 16 GB RAM auf einer Samsung XP941 M.2 PCIe-SSD-Festplatte erzeugt.
Der Leistungsgewinn ist hauptsächlich auf die Anzahl der verfügbaren Kerne zurückzuführen. Wir würden erwarten, dass Sie bei einem sauberen Build ungefähr einen 4-fachen Gewinn mit einer 4-Kern-CPU oder einen 12-fachen Speedup mit einer 12-Kern-CPU sehen werden. TwineCompile implementiert jedoch auch Caching und verfügt über andere Techniken, die in anderen Szenarien helfen (d.h. Make, kein sauberer Build, oder ressourcenbeschränktere Maschinen), so dass ein Make noch schneller sein kann. Es wird manchmal ein 50-facher Speedup genannt, der in einigen Szenarien erreicht werden kann – sehr beeindruckend.
Sie können TwineCompile heute in GetIt finden, im Abschnitt ‚IDE Plugins‘. Es ist sowohl für Professional als auch für Architect/Enterprise kostenlos, wenn Sie ein aktives Update-Abonnement haben (das ist neu, es war nicht immer für Pro verfügbar, aber jetzt schon).
Ich empfehle Ihnen den Download! Wir sind gespannt, welchen Unterschied es für Ihr Projekt macht.
Tue Dec 15 2020 23:15:35 GMT+0700 (Western Indonesia Time)
Расширенная разметка редактора кода, пользовательский интерфейс стека вызовов и инструменты многопоточной отладки — в новом подключаемом модуле для RAD Studio теперь доступны бесплатно.
Мы очень рады объявить о доступном сегодня новом расширении IDE для RAD Studio 10.4.1, созданном тем же автором, что и популярные плагины для закладок и навигатора, Parnassus. Если вы читаете это, он уже доступен в GetIt для всех, у кого есть подписка на обновления: просто откройте GetIt, перейдите в раздел «Плагины IDE» и установите «Параллельный отладчик». Для этого требуется Delphi или C ++ Builder 10.4.1 или новее.
Что это такое?
Инструмент для отладки многопоточных приложений
… А также помогает отлаживать традиционные однопоточные приложения!
Что-то для каждого. Читайте дальше!
Некоторая новая разметка редактора, полезная для вас, даже если вы не используете несколько потоков в своем приложении!
Проблема
Если в вашем приложении более одного потока, вы, вероятно, захотите отладить взаимодействие потоков. Традиционное представление отлаженного приложения в среде IDE, хотя в нем может быть указано несколько потоков в представлении потоков, заключается в том, чтобы рассматривать приложение так, как будто оно имеет только один поток: вы увидите только один стек вызовов и элементы управления запуском / паузой / шагом предназначены для всего процесса. Это оставляет вас, разработчика, который должен отлаживать ваше приложение, с такими вопросами, как:
Как узнать, работают ли одновременно несколько потоков в одном коде?
Как мне узнать, что делают все мои потоки одновременно?
Как выполнить метод всего в одном потоке?
То есть, как мне отлаживать один поток без запуска других потоков и выполнения кода, который я не хочу, чтобы они не попадали в точки останова и т. Д.?
Сколько ЦП использует каждый из моих потоков? Они эффективны?
И, возможно, другие вопросы или пожелания, даже отладка только в одном потоке, например:
Я бы хотел, чтобы все методы в стеке вызовов были выделены в моем коде легко.
Хотел бы я легко сделать точку останова применимой только к определенному потоку
Я бы хотел, чтобы разметка редактора, показывающая текущую строку кода, выглядела более очевидной.
Я хочу, чтобы при приостановке процесса он не выводил меня в представление CPU, а показывал мне только мой собственный источник
На каждый из этих вопросов отвечает этот новый плагин.
Давайте пробежимся по его особенностям. В следующем разделе вы прочитаете о представлении Parallel Threads и стеках параллельных вызовов; поточный запуск и пошаговое выполнение; вид процесса; новая разметка редактора, включая потоки и стеки вызовов в редакторе; установка сродства потока точки останова; перемещение текущего исполнения; новое главное меню темы; и больше…
Представление «Параллельные потоки»
Просмотр> Окна отладки> Параллельные потоки
В этом окне перечислены все потоки в процессе, перечисленные по горизонтали. Когда ваше приложение работает, если оно в Windows, у каждого потока есть диаграмма, отображающая использование ЦП.
Когда приложение приостановлено, каждый поток отображает свой стек вызовов.
Каждому потоку назначается уникальный цвет , начиная со среднего синего для основного потока приложения. Этот цвет используется в качестве визуального ориентира для повсеместной идентификации нити.
Отображаются названия потоков . Даже если вы не называете свой основной поток, Parallel Debugger достаточно умен, чтобы его обнаружить.
Текущая резьба выделена полужирным шрифтом и имеет тонкую рамку своего цвета вокруг нее. Дважды щелкните заголовок обсуждения (его имя), чтобы сделать его текущим.
Записи стека вызовов без исходного кода, т. Е. Не подлежащие отладке без использования представления ЦП, по умолчанию свернуты. Вы можете расширить их (или отключить, чтобы отобразить традиционный стек вызовов).
При приостановке процесса отладчик всегда будет показывать верхнюю запись стека отлаживаемых вызовов. То есть он может не отображать верхнюю запись в стеке вызовов, как это обычно делает IDE, но он будет отображать ваш исходный код, который вызывает его. Идея здесь в том, чтобы отлаживать то, что вы контролируете, — всегда показывать источник.
Крайняя левая кнопка на каждой панели инструментов потока приостанавливает весь процесс, делая этот поток текущим потоком. Это «приостановить процесс в этом потоке». Крайняя правая кнопка позволяет вам изменять порядок отображения потоков, закрепляя потоки слева или рядом с другим закрепленным потоком. Это полезно, когда в вашем приложении много потоков, и вы хотите, чтобы те, которые вам интересны, были сгруппированы вместе. Если закрепленный поток имеет имя, закрепление сохраняется при перезапуске процесса: когда вы завершаете и перезапускаете приложение, те же потоки будут закреплены.
Запуск или переход по одному потоку
Остальные кнопки панели инструментов предназначены для управления ходом резьбы.
Стандартные средства управления запуском, переходом, переходом и т. Д. В среде IDE являются уровнями процесса; то есть они будут запускать весь процесс, пробуждая все потоки, и вы просто надеетесь, что больше ничего не произойдет, пока операция перехода не будет завершена в потоке, который вы просматриваете. На практике может многое — исключения, точки останова и т. Д. — плюс, конечно, иногда вы просто хотите убедиться, что другие потоки не запускаются при отладке одного потока.
Эти кнопки панели инструментов позволяют запускать и переходить на уровень потока. Вы можете:
Запустить только этот поток, оставив все остальные потоки приостановленными
Оставить этот поток приостановленным, но запустить все остальные потоки
Войдите в метод, только в этой ветке
Переступайте через строку кода только в этом потоке. Это позволяет запускать и шагать только этот поток; никакие другие потоки не могут работать одновременно
Запускать до возврата из метода, только для этого потока
Чтобы использовать их, убедитесь, что интересующий вас поток является текущим, дважды щелкнув его заголовок или имя. Вы увидите, что название выделено жирным шрифтом.
У каждого из них есть сочетание клавиш, то есть вы можете выполнять действия (и т. Д.) С помощью клавиатуры, а не просто нажимая кнопку с помощью мыши. Ярлыки отображаются в меню «Тема», в котором есть пункты меню для текущей цепочки (см. Ниже).
Управление запуском потока — одна из самых мощных функций Parallel Debugger.
Интеграция редактора
Одна из важных задач при понимании того, что происходит в многопоточном приложении, — это знать, когда несколько потоков выполняются в одной и той же области кода. Parallel Debugger делает это понятным, добавляя разметку в редакторе для полного стека вызовов каждого потока. Они отображаются с помощью «тегов», небольших цветных маркеров в правой части редактора.
Верхняя запись стека вызовов — то есть там, где поток выполняется «сейчас» — помечена сплошным тегом с использованием цвета потока. Другие записи стека вызовов для того же потока имеют бледную версию цвета потока (отмечая, что поток все еще отмечен сплошным кружком в теге).
Это позволяет вам быстро читать код и знать, что «поток X выполняется где-то внутри этой строки кода» и «поток Y и поток Z сейчас находятся в одном методе». Вы даже увидите, где именно находятся нити. На этом снимке экрана текущий поток — синий, а второй поток (светло-красный) выполняется со своей текущей точкой выполнения внутри IsPrime (), но вызов IsPrime выделил строку над точкой выполнения текущего потока.
Перемещение исполнения
Перед установкой плагина в среде IDE точка выполнения текущего потока отображалась маленькой синей стрелкой. Теперь он заменен большим шевроном в левой части редактора кода.
Вы можете изменить положение точки выполнения — где поток начнет выполняться в следующий раз, когда вы нажмете «Выполнить» или «Шаг» — просто щелкнув и перетащив этот маркер.
Сходство потока точки останова
По умолчанию точки останова применяются ко всем потокам. Перед установкой плагина точки останова были нарисованы с помощью красной точки, но с потоками Parallel Debugger выделены цвета, а красный цвет означает красную ветку. Точки останова, которые применяются ко всем потокам, теперь отображаются в виде разноцветного колеса.
Чтобы точка останова применялась только к определенному потоку, щелкните точку останова правой кнопкой мыши. Новое меню точки останова позволяет вам выбрать поток, к которому будет применяться точка останова.
Здесь эта точка останова применяется только к зеленому потоку.
Обзор процесса
Просмотр> Отладка Windows> Процесс
В этом окне отображается информация о процессе в целом. Он отображает использование ЦП на уровне процесса (снова разделенное на ядро и пользовательский режим), тип процесса (например, Wow64), а также кнопки запуска / паузы / сброса и т. Д. Это уровень процесса, то есть они обеспечивают ту же функциональность, что и собственная панель инструментов запуска среды IDE.
Вы также можете просмотреть список потоков, нажав кнопку внизу, как быстрый способ выбрать текущий поток (поскольку горизонтальная прокрутка в представлении потоков может занять больше времени, если у вас много потоков).
Главное меню темы
В среде IDE теперь есть меню «Поток», расположенное справа от меню «Выполнить». Это предоставляет меню для большинства прямых операций, которые вы можете выполнять с потоком. Он позволяет вам установить интересующий поток (то есть текущий поток, если процесс приостановлен, или поток, который вы хотите стать текущим потоком в следующий раз, когда вы приостановите), а для текущего потока есть пункты меню для управления запуском потока. Вы можете видеть ярлыки в этих пунктах меню.
Он также перечисляет каждый поток в приложении, и для каждого из них показано, что вы выполняете управление плюс закрепление, фактически те же функции, что и в представлении Parallel Threads.
Уровень функций
Наконец, самый верхний пункт меню контролирует уровень функций Parallel Debugger: что он делает, когда ваше приложение работает. Самый низкий уровень предназначен только для отслеживания использования ЦП: используйте его, если вы хотите, чтобы параллельный отладчик был установлен, но в настоящее время вы не хотите активно использовать его для этого приложения. Следующие два уровня контролируют, насколько глубоко отладчик отслеживает стеки вызовов потоков.
Используйте это, если у вас есть десятки или сотни потоков. В этой ситуации вас, вероятно, интересует только подмножество потоков. Установите уровень функции на «Только выбранные стеки вызовов», и параллельный отладчик будет отслеживать стеки вызовов для основного потока, закрепленных потоков и текущего потока только по умолчанию. Вы всегда можете получить стек вызовов для любого потока, нажав кнопку, отображаемую над областью стека вызовов в представлении потоков.
Поддерживаемые платформы
Параллельный отладчик имеет полную функциональность при локальной отладке приложений в Windows.
На других платформах или при удаленной отладке функциональность зависит от того, что поддерживает отладчик. Использование ЦП поддерживается только для локальных (без удаленной отладки) приложений Windows. Пошаговое выполнение или выполнение отдельных потоков будет работать только на платформах, поддерживающих замораживание потоков. Существует известная проблема для C ++ Win64, когда стеки вызовов не могут быть оценены: это будет исправлено в следующей версии C ++ Builder.
Следуя традиции Парнаса, начатой с закладок, параллельный отладчик действительно решает ошибку! ( RSP-29768 .)
В общем: если вы используете Windows, отладчик имеет полную функциональность.
Плагин поддерживает RAD Studio 10.4.1 (и новее, когда выйдет 10.4.2.)
Получение параллельного отладчика
Параллельный отладчик теперь в GetIt!
Благодаря Embarcadero Parnassus делает отладчик бесплатным для всех клиентов RAD Studio с активной подпиской на обновления. Откройте GetIt, перейдите в категорию подключаемых модулей IDE и нажмите «Установить».
И Parnassus, и Embarcadero надеются, что вы найдете это расширение отличным дополнением к вашей IDE.
От себя лично я хотел бы поблагодарить Embarcadero за интерес к плагину и желание добавить его в GetIt, а также всех моих бета-тестеров, которые с августа использовали различные версии этого плагина, качество которых постепенно улучшалось. Всем большое спасибо!
Tue Dec 15 2020 23:15:11 GMT+0700 (Western Indonesia Time)
Marcação de editor de código avançado, interface de usuário de pilha de chamadas e ferramentas de depuração multithread – em um novo plugin para RAD Studio agora disponível gratuitamente.
Temos o prazer de anunciar uma nova extensão IDE disponível hoje para RAD Studio 10.4.1, criada pelo mesmo autor que os populares plug-ins Bookmarks e Navigator, Parnassus. Se você está lendo isso, ele já está disponível no GetIt para qualquer pessoa com assinatura de atualização: basta abrir o GetIt, ir para a seção Plug-ins do IDE e instalar o ‘Depurador Paralelo’. Requer Delphi ou C ++ Builder 10.4.1 ou mais recente.
O que é isso?
Uma ferramenta para depurar aplicativos multithread
… E também ajuda a depurar aplicativos tradicionais de thread único!
Algo para todos. Leia mais!
Algumas das novas marcações do editor, úteis para você mesmo se você não usar vários tópicos em seu aplicativo!
O problema
Se você tiver mais de um encadeamento em seu aplicativo, provavelmente deseja depurar a interação do encadeamento. Uma visão do IDE tradicional de um aplicativo depurado, embora possa listar vários threads em uma visão Threads, é tratar o aplicativo como se tivesse apenas um único thread: você verá apenas uma pilha de chamadas e os controles de execução / pausa / etapa são para todo o processo. Isso deixa você, um desenvolvedor que precisa depurar seu aplicativo, com perguntas como:
Como posso ver se vários threads estão em execução no mesmo código ao mesmo tempo?
Como posso ver o que todos os meus tópicos estão fazendo ao mesmo tempo?
Como passo por um método em apenas um thread?
Ou seja, como faço para depurar um thread sem outros threads em execução e execução de código que eu não quero, atingindo pontos de interrupção, etc?
Quanta CPU está usando cada um dos meus threads? Eles são eficientes?
E talvez outras dúvidas ou desejos, até mesmo depurando apenas em um único thread, como:
Eu gostaria que fosse fácil ver todos os métodos na pilha de chamadas destacados em meu código
Eu gostaria de poder facilmente fazer um ponto de interrupção se aplicar apenas a um determinado tópico
Eu gostaria que a marcação do editor mostrando a linha de código atual parecesse um pouco mais óbvia
Eu gostaria que, ao pausar o processo, ele não me levasse para a visualização da CPU, mas me mostrasse apenas minha própria fonte
Cada uma delas é respondida por este novo plugin.
Vamos examinar seus recursos. Na próxima seção, você lerá sobre a exibição Parallel Threads e as pilhas de chamadas paralelas; execução e revisão por thread; a visualização do processo; nova marcação do editor, incluindo threads e pilhas de chamadas no editor; definir a afinidade de thread de um ponto de interrupção; mover a execução atual; o novo menu principal do Thread; e mais…
A visão Parallel Threads
Exibir> Janelas de depuração> Threads paralelos
Esta janela lista todos os threads no processo, listados horizontalmente. Quando seu aplicativo está em execução, se estiver no Windows, cada thread tem um gráfico exibindo o uso da CPU.
Quando o aplicativo é pausado, cada thread exibe sua pilha de chamadas.
Cada thread recebe uma cor exclusiva , começando com um azul médio para o thread principal do aplicativo. Esta cor é usada como um guia visual para identificar o fio em todos os lugares.
Os nomes dos threads são exibidos. Mesmo se você não nomear seu thread principal, o Parallel Debugger é inteligente o suficiente para detectá-lo.
O segmento atual está em negrito e tem uma borda fina de sua cor ao redor. Clique duas vezes no título de um tópico (seu nome) para torná-lo o tópico atual.
As entradas da pilha de chamadas sem código-fonte – ou seja, não depuráveis sem usar a visualização da CPU – são reduzidas por padrão. Você pode expandi-los (ou desligá-los para mostrar uma pilha de chamadas tradicional).
Ao pausar o processo, o depurador sempre mostrará a entrada principal da pilha de chamadas depurável. Ou seja, pode não mostrar a entrada superior na pilha de chamadas da maneira que o IDE tradicionalmente faz, mas mostrará o código-fonte seu que faz a chamada. A ideia aqui é depurar o que você tem controle – sempre mostre a fonte.
O botão mais à esquerda em cada barra de ferramentas de encadeamento pausa todo o processo, tornando esse encadeamento o encadeamento atual. É ‘pausar o processo neste tópico’. O botão mais à direita permite alterar a ordem de exibição dos tópicos, fixando os tópicos à esquerda ou ao lado de outro tópico fixado. Isso é útil quando você tem muitos threads em seu aplicativo e deseja manter aqueles de seu interesse agrupados. Se um encadeamento fixado tiver um nome, a fixação é persistente nas reinicializações do processo: quando você encerra e reinicia seu aplicativo, os mesmos encadeamentos são fixados.
Executando ou escalando um único thread
Os botões restantes da barra de ferramentas são para controle de execução de thread.
Os controles normais de execução, passagem, entrada, etc. do IDE são de nível de processo; isto é, eles executarão todo o processo, ativando todos os threads, e você apenas espera que nada mais aconteça até que a operação passo a passo seja concluída no thread que você está examinando. Na prática, muitos podem – exceções, pontos de interrupção, etc. – mais, é claro, às vezes você só quer ter certeza de que outros encadeamentos não sejam executados durante a depuração de um único encadeamento.
Esses botões da barra de ferramentas permitem que você execute e pise em um nível por thread. Você pode:
Execute apenas este tópico, mantendo todos os outros tópicos em pausa
Mantenha este tópico em pausa, mas execute todos os outros tópicos
Entre em um método, apenas neste tópico
Passe por uma linha de código, apenas neste tópico. Isso permite que apenas este segmento seja executado e executado; nenhum outro tópico pode ser executado ao mesmo tempo
Executar até o retorno do método, apenas para este segmento
Para usá-los, certifique-se de que o tópico no qual você está interessado seja o tópico atual, clicando duas vezes em seu título ou nome. Você verá que desenha o título em negrito.
Cada um deles possui um atalho de teclado, o que significa que você pode acessar (etc) através do teclado, não apenas clicando em um botão com o mouse. Os atalhos são visíveis no menu Thread, que possui itens de menu para o thread atual (veja abaixo).
O controle de execução por thread é um dos recursos mais poderosos do Parallel Debugger.
Integração do Editor
Uma tarefa importante para entender o que está acontecendo em um aplicativo multithread é saber quando vários threads estão sendo executados na mesma área do código. O Parallel Debugger deixa isso claro ao adicionar marcação no editor para cada pilha de chamadas completa do thread. Eles são mostrados por meio de ‘tags’, pequenos marcadores coloridos no lado direito do editor.
A entrada da pilha de chamadas superior – ou seja, onde o encadeamento está sendo executado ‘agora’ – é marcada com uma tag de cor sólida, usando a cor do encadeamento. Outras entradas da pilha de chamadas para o mesmo tópico estão em uma versão desbotada da cor do tópico (observe que o tópico ainda está marcado com um círculo sólido na tag).
Isso permite que você leia rapidamente seu código e saiba, ‘Thread X está sendo executado em algum lugar dentro desta linha de código’ e ‘Thread Y e Thread Z estão ambos no mesmo método agora’. Você verá até onde os fios estão exatamente. Nesta captura de tela, o encadeamento atual é o azul e um segundo encadeamento (vermelho claro) está sendo executado com seu ponto de execução atual dentro de IsPrime (), mas a chamada para IsPrime destacou a linha acima do ponto de execução do encadeamento atual.
Execução Móvel
Antes de instalar o plugin, o IDE costumava exibir o ponto de execução do thread atual com uma pequena seta azul. Isso agora foi substituído por um grande chevron no lado esquerdo do editor de código.
Você pode alterar onde está o ponto de execução – onde o thread começará a ser executado na próxima vez que você clicar em Executar ou Etapa – simplesmente clicando e arrastando este marcador.
Afinidade de Thread de Ponto de Interrupção
Por padrão, os pontos de interrupção se aplicam a todos os threads. Antes de instalar o plug-in, os pontos de interrupção foram desenhados com um ponto vermelho, mas com o Parallel Debugger os threads recebem cores e vermelho significa o thread vermelho. Os pontos de interrupção que se aplicam a todos os threads agora são desenhados como uma roda multicolorida.
Para fazer um ponto de interrupção se aplicar a apenas um segmento específico, clique com o botão direito do mouse no ponto de interrupção. O novo menu Breakpoint permite que você escolha um thread ao qual o breakpoint será aplicado.
Aqui, esse ponto de interrupção se aplica apenas ao segmento verde.
A visão do processo
Exibir> Janelas de depuração> Processo
Esta janela mostra informações sobre o processo como um todo. Ele exibe o uso da CPU no nível do processo (novamente dividido em kernel e modo do usuário), o tipo de processo (por exemplo, Wow64) e tem botões executar / pausar / redefinir etc. Eles são de nível de processo, ou seja, fornecem a mesma funcionalidade que a barra de ferramentas de execução do próprio IDE.
Você também pode ver uma lista de tópicos clicando no botão na parte inferior, como uma maneira rápida de escolher o tópico atual (já que rolar horizontalmente na visualização Tópicos pode demorar mais se você tiver muitos tópicos.)
O menu principal do Tópico
O IDE agora tem um menu Thread, localizado à direita do menu Run. Isso fornece um menu para a maioria das operações diretas que você pode realizar para um thread. Ele permite que você defina o thread de interesse (ou seja, o thread atual se o processo estiver pausado, ou o thread que você deseja que se torne o thread atual na próxima pausa), e para o thread atual tem itens de menu para controle de execução do thread. Você pode ver os atalhos nesses itens de menu.
Ele também lista cada thread no aplicativo, e para cada um mostra que você executa o controle e a fixação, efetivamente os mesmos recursos da visualização Threads paralelos.
Nível de recurso
Por fim, o item de menu superior controla o nível de recurso do Parallel Debugger: o que ele faz quando seu aplicativo está em execução. O nível mais baixo é apenas para rastrear o uso da CPU: use-o se quiser que o depurador paralelo seja instalado, mas não deseja usá-lo ativamente para este aplicativo atualmente. Os próximos dois níveis controlam a profundidade com que o depurador rastreia as pilhas de chamadas de thread.
Use isso se você tiver dezenas ou centenas de tópicos. Nessa situação, você provavelmente está interessado apenas em um subconjunto de threads. Defina o nível de recurso como ‘Somente Pilhas de Chamadas Selecionadas’, e o depurador paralelo rastreará as pilhas de chamadas para o encadeamento principal, encadeamentos fixados e o encadeamento atual apenas por padrão. Você sempre pode obter a pilha de chamadas de qualquer thread clicando em um botão exibido na área da pilha de chamadas na visualização Threads.
Plataformas Suportadas
O Parallel Debugger tem funcionalidade total ao depurar localmente aplicativos no Windows.
Em outras plataformas, ou depuração remota, a funcionalidade depende do que o depurador suporta. O uso da CPU é compatível apenas com aplicativos locais do Windows (depuração não remota). A revisão ou execução por thread só funcionará em plataformas que suportam o congelamento de thread. Há um problema conhecido para C ++ Win64 em que as pilhas de chamadas não podem ser avaliadas: isso será corrigido em uma próxima versão do C ++ Builder.
Seguindo uma tradição do Parnassus iniciada com os Bookmarks, o Parallel Debugger resolve um bug! ( RSP-29768 .)
Em geral: se você estiver usando o Windows, o depurador tem funcionalidade total.
O plug-in suporta RAD Studio 10.4.1 (e mais recente, quando o 10.4.2 for lançado).
Obtendo o depurador paralelo
O depurador paralelo já está no GetIt!
Graças à Embarcadero, a Parnassus está disponibilizando o depurador gratuitamente para qualquer cliente RAD Studio com assinatura de atualização ativa. Abra GetIt, vá para a categoria Plug-ins IDE e clique em Instalar.
Tanto o Parnassus quanto o Embarcadero esperam que você considere esta extensão um ótimo acréscimo ao seu IDE.
A título pessoal, gostaria de agradecer à Embarcadero por se interessar pelo plugin e querer adicioná-lo ao GetIt, e a todos os meus testadores beta que usaram várias versões deste plugin de qualidade crescente desde agosto. Muito obrigado a todos!
Tue Dec 15 2020 23:14:44 GMT+0700 (Western Indonesia Time)
Marcado de editor de código avanzado, IU de pila de llamadas y herramientas de depuración multiproceso: en un nuevo complemento para RAD Studio ahora disponible gratuitamente.
Nos complace anunciar una nueva extensión IDE disponible hoy para RAD Studio 10.4.1, creada por el mismo autor que los populares complementos de marcadores y navegador, Parnassus. Si está leyendo esto, ya está disponible en GetIt para cualquier persona con suscripción de actualización: simplemente abra GetIt, vaya a la sección Complementos IDE e instale el ‘Depurador paralelo’. Requiere Delphi o C ++ Builder 10.4.1 o más reciente.
¿Qué es?
Una herramienta para depurar aplicaciones multiproceso
… ¡Y también ayuda a depurar las aplicaciones tradicionales de un solo hilo!
Algo para todos. ¡Sigue leyendo para más información!
Algunas de las nuevas marcas del editor, útiles para ti incluso si no usas varios hilos en tu aplicación
El problema
Si tiene más de un hilo en su aplicación, probablemente haya querido depurar la interacción del hilo. La vista de un IDE tradicional de una aplicación depurada, si bien puede enumerar varios subprocesos en una vista de subprocesos, es tratar la aplicación como si tuviera un solo subproceso: verá solo una pila de llamadas y los controles de ejecución / pausa / paso son para todo el proceso. Esto lo deja a usted, un desarrollador que tiene que depurar su aplicación, con preguntas como:
¿Cómo veo si se ejecutan varios subprocesos en el mismo código a la vez?
¿Cómo veo lo que están haciendo todos mis hilos al mismo tiempo?
¿Cómo paso por un método en un solo hilo?
Es decir, ¿cómo depuro un hilo sin que otros hilos se ejecuten y ejecuten código que no quiero que hagan, alcanzando puntos de interrupción, etc.?
¿Cuánta CPU utiliza cada uno de mis subprocesos? ¿Son eficientes?
Y quizás otras preguntas o deseos, incluso depurando solo en un solo hilo, como:
Desearía que fuera fácil ver todos los métodos en la pila de llamadas resaltados en mi código
Ojalá pudiera hacer que un punto de interrupción solo se aplique a un hilo en particular
Desearía que el marcado del editor que muestra la línea de código actual parezca un poco más obvio
Ojalá, al pausar el proceso, no me llevara a la vista de la CPU, sino que me mostrara solo mi propia fuente
Cada uno de estos es respondido por este nuevo complemento.
Repasemos sus características. En la siguiente sección, leerá sobre la vista de subprocesos paralelos y las pilas de llamadas paralelas; ejecución y paso por hilo; la vista Proceso; nuevo marcado del editor que incluye hilos y pilas de llamadas en el editor; establecer la afinidad del hilo de un punto de interrupción; mover la ejecución actual; el nuevo menú principal de Thread; y más…
La vista de subprocesos paralelos
Ver> Depurar ventanas> Subprocesos paralelos
Esta ventana enumera todos los hilos del proceso, enumerados horizontalmente. Cuando su aplicación se está ejecutando, si está en Windows, cada hilo tiene un gráfico que muestra su uso de CPU.
Cuando la aplicación está en pausa, cada hilo muestra su pila de llamadas.
A cada hilo se le asigna un color único , comenzando con un azul medio para el hilo principal de la aplicación. Este color se utiliza como guía visual para identificar el hilo en todas partes.
Se muestran los nombres de los hilos. Incluso si no nombra su hilo principal, Parallel Debugger es lo suficientemente inteligente como para detectarlo.
El hilo actual está en negrita y tiene un borde delgado de su color alrededor. Haga doble clic en el título de un hilo (su nombre) para convertirlo en el hilo actual.
Las entradas de la pila de llamadas sin código fuente, es decir, no depurables sin usar la vista de la CPU, se contraen de forma predeterminada. Puede expandirlos (o desactivarlo para mostrar una pila de llamadas tradicional).
Al pausar el proceso, el depurador siempre mostrará la entrada de la pila de llamadas depurable superior. Es decir, es posible que no muestre la entrada superior en la pila de llamadas como lo hace tradicionalmente el IDE, pero mostrará el código fuente suyo que llama a él. La idea aquí es depurar aquello sobre lo que tiene control; mostrar siempre la fuente.
El botón más a la izquierda en cada barra de herramientas de hilo pausa todo el proceso, haciendo que ese hilo sea el hilo actual. Es ‘pausar el proceso en este hilo’. El botón más a la derecha le permite cambiar el orden en que se muestran los hilos, fijándolos a la izquierda o al lado de otro hilo fijado. Esto es útil cuando tienes muchos hilos en tu aplicación y quieres mantener agrupados los que te interesan. Si un hilo fijo tiene un nombre, el anclaje es persistente en los reinicios del proceso: cuando finaliza y reinicia su aplicación, se fijarán los mismos hilos.
Ejecución o paso de un solo hilo
Los botones restantes de la barra de herramientas son para el control de la ejecución del hilo.
Los controles normales de ejecución, paso sobre, paso dentro, etc. del IDE son a nivel de proceso; es decir, ejecutarán todo el proceso, despertando todos los subprocesos, y solo espera que no ocurra nada más hasta que se complete la operación de paso en el subproceso que está viendo. En la práctica, muchos pueden (excepciones, puntos de interrupción, etc.) y, por supuesto, a veces solo desea asegurarse de que otros subprocesos no se ejecuten mientras se depura un solo subproceso.
Estos botones de la barra de herramientas le permiten correr y pisar un nivel por hilo. Usted puede:
Ejecute solo este hilo, manteniendo todos los demás hilos en pausa
Mantenga este hilo en pausa, pero ejecute todos los demás hilos
Ingrese a un método, solo en este hilo
Pase sobre una línea de código, solo en este hilo. Esto permite que solo este hilo se ejecute y pase; no se permite que otros subprocesos se ejecuten al mismo tiempo
Ejecutar hasta que el método regrese, solo para este hilo
Para usarlos, asegúrese de que el hilo que le interesa sea el hilo actual, haciendo doble clic en su título o nombre. Verá que dibuja su título en negrita.
Cada uno de estos tiene un atajo de teclado, lo que significa que puede pasar (etc.) a través del teclado, no solo haciendo clic en un botón con el mouse. Los accesos directos son visibles en el menú Tema que tiene elementos de menú para el tema actual (ver más abajo).
El control de ejecución por subproceso es una de las características más poderosas del depurador paralelo.
Integración del editor
Una tarea importante a la hora de comprender lo que sucede en una aplicación multiproceso es saber cuándo se están ejecutando varios subprocesos en la misma área de código. Parallel Debugger deja esto en claro agregando marcas en el editor para la pila de llamadas completa de cada hilo. Estos se muestran a través de ‘etiquetas’, pequeños marcadores de colores en el lado derecho del editor.
La entrada de la pila de llamadas superior, es decir, donde el hilo se está ejecutando ‘ahora’, está marcada con una etiqueta de color sólido, usando el color del hilo. Otras entradas de la pila de llamadas para el mismo hilo están en una versión desvaída del color del hilo (teniendo en cuenta que el hilo todavía está marcado con un círculo sólido en la etiqueta).
Esto le permite leer rápidamente su código y saber, ‘Thread X se está ejecutando en algún lugar dentro de esta línea de código’ y ‘Thread Y y Thread Z están ambos en el mismo método en este momento’. Incluso verá dónde están exactamente los hilos. En esta captura de pantalla, el hilo actual es el azul y un segundo hilo (rojo claro) se está ejecutando con su punto de ejecución actual dentro de IsPrime (), pero la llamada a IsPrime resaltó la línea sobre el punto de ejecución del hilo actual.
Ejecución en movimiento
Antes de instalar el complemento, el IDE solía mostrar el punto de ejecución del hilo actual con una pequeña flecha azul. Eso ahora se reemplaza con un gran cheurón en el lado izquierdo del editor de código.
Puede cambiar dónde está el punto de ejecución, desde dónde comenzará a ejecutarse el hilo la próxima vez que presione Ejecutar o Paso, simplemente haciendo clic y arrastrando este marcador.
Afinidad de subproceso de punto de interrupción
todos los hilos. Antes de instalar el complemento, los puntos de interrupción se dibujaban con un punto rojo, pero con el depurador paralelo se dan colores a los hilos, y rojo significa hilo rojo. Los puntos de interrupción que se aplican a todos los hilos ahora se dibujan como una rueda multicolor.
Para que un punto de interrupción se aplique solo a un hilo específico, haga clic con el botón derecho en el punto de interrupción. El nuevo menú Breakpoint le permite elegir un hilo al que se aplicará el breakpoint.
Aquí, este punto de interrupción solo se aplica al hilo verde.
La vista Proceso
Ver> Depurar ventanas> Proceso
conjunto. Muestra el uso de CPU a nivel de proceso (nuevamente dividido en kernel y modo de usuario), el tipo de proceso (por ejemplo, Wow64), y tiene botones de ejecución / pausa / reinicio, etc. Estos son a nivel de proceso, es decir, proporcionan la misma funcionalidad que la barra de herramientas de ejecución del propio IDE.
También puede ver una lista de hilos haciendo clic en el botón en la parte inferior, como una forma rápida de elegir el hilo actual (ya que desplazarse horizontalmente en la vista de hilos puede llevar más tiempo si tiene muchos hilos).
El menú principal de Thread
El IDE ahora tiene un menú Thread, ubicado a la derecha del menú Run. Esto proporciona un menú para la mayoría de las operaciones directas que puede realizar para un hilo. Le permite establecer el hilo de interés (es decir, el hilo actual si el proceso está en pausa, o el hilo que desea que se convierta en el hilo actual la próxima vez que haga una pausa), y para el hilo actual tiene elementos de menú para el control de ejecución del hilo. Puede ver atajos en estos elementos del menú.
También enumera cada subproceso en la aplicación, y para cada uno muestra que ejecuta el control más la fijación, efectivamente las mismas características que en la vista Subprocesos paralelos.
Nivel de característica
Finalmente, el elemento del menú superior controla el nivel de funciones del depurador paralelo: lo que hace cuando su aplicación se está ejecutando. El nivel más bajo es solo para rastrear el uso de la CPU: use esto si desea que se instale el depurador paralelo, pero no desea usarlo activamente para esta aplicación actualmente. Los siguientes dos niveles controlan la profundidad con la que el depurador rastrea las pilas de llamadas de subprocesos.
Use esto si tiene docenas o cientos de hilos. En esta situación, es probable que solo le interese un subconjunto de hilos. Establezca el nivel de función en ‘Solo pilas de llamadas seleccionadas’, y el depurador paralelo rastreará las pilas de llamadas para el subproceso principal, subprocesos anclados y el subproceso actual solo de forma predeterminada. Siempre puede obtener la pila de llamadas para cualquier subproceso haciendo clic en un botón que se muestra sobre el área de la pila de llamadas en la vista Subprocesos.
Plataformas compatibles
Parallel Debugger tiene una funcionalidad completa al depurar aplicaciones localmente en Windows.
En otras plataformas, o en la depuración remota, la funcionalidad depende de lo que admita el depurador. El uso de CPU solo es compatible con aplicaciones de Windows locales (depuración no remota). El paso o ejecución por hilo solo funcionará en plataformas que admitan la congelación de hilos. Existe un problema conocido para C ++ Win64 donde las pilas de llamadas no se pueden evaluar: esto se solucionará en una próxima versión de C ++ Builder.
Siguiendo una tradición de Parnassus que comenzó con los marcadores, el depurador paralelo realmente resuelve un error. ( RSP-29768 .)
En general: si usa Windows, el depurador tiene funcionalidad completa.
El complemento es compatible con RAD Studio 10.4.1 (y más reciente, cuando salga 10.4.2).
Obtener el depurador paralelo
¡El depurador paralelo está en GetIt ahora!
Gracias a Embarcadero, Parnassus hace que el depurador esté disponible gratuitamente para cualquier cliente de RAD Studio con una suscripción de actualización activa. Abra GetIt, vaya a la categoría Complementos IDE y haga clic en Instalar.
Tanto Parnassus como Embarcadero esperan que esta extensión sea una gran adición a su IDE.
En una nota personal, me gustaría agradecer a Embarcadero por estar interesado en el complemento y querer agregarlo a GetIt, y a todos mis probadores beta que han usado varias versiones de este complemento de calidad que aumenta lentamente desde agosto. ¡Muchas gracias a todos!
Tue Dec 15 2020 23:14:28 GMT+0700 (Western Indonesia Time)
Erweitertes Code-Editor-Markup, Call-Stack-UI und Multithreading-Debugging-Tools – in einem neuen Plugin für RAD Studio, das jetzt kostenlos erhältlich ist.
Wir freuen uns sehr, heute eine neue IDE-Erweiterung für RAD Studio 10.4.1 ankündigen zu können, die vom gleichen Autor wie die beliebten Plugins Bookmarks und Navigator, Parnassus, erstellt wurde. Wenn Sie dies lesen, ist sie bereits in GetIt für jeden mit Update-Abonnement verfügbar: Öffnen Sie einfach GetIt, gehen Sie zum Abschnitt IDE-Plugins und installieren Sie den ‚Parallel Debugger‘. Er erfordert Delphi oder C++Builder 10.4.1 oder neuer.
Was ist das?
Ein Werkzeug zum Debuggen von Multithreading-Anwendungen
…und es hilft auch beim Debuggen traditioneller Singlethreading-Anwendungen!
Etwas für jeden. Lesen Sie weiter für mehr!
Einige der neuen Editor-Auszeichnungen, die für Sie nützlich sind, auch wenn Sie nicht mehrere Threads in Ihrer App verwenden!
Das Problem
Wenn Sie mehr als einen Thread in Ihrer Anwendung haben, wollten Sie wahrscheinlich schon einmal die Thread-Interaktion debuggen. Eine herkömmliche IDE betrachtet eine debuggte Anwendung zwar in einer Threads-Ansicht mit mehreren Threads, behandelt die Anwendung aber so, als hätte sie nur einen einzigen Thread: Sie sehen nur einen Aufrufstapel, und die Lauf/Pause/Schritt-Steuerungen gelten für den gesamten Prozess. Das lässt Sie, einen Entwickler, der Ihre App debuggen muss, mit Fragen zurück wie:
Wie kann ich sehen, ob mehrere Threads gleichzeitig im selben Code laufen?
Wie sehe ich, was alle meine Threads zu einem bestimmten Zeitpunkt tun?
Wie kann ich eine Methode in nur einem Thread durchlaufen?
D.h. wie debugge ich einen Thread, ohne dass andere Threads laufen und Code ausführen, den ich nicht haben will, oder Breakpoints treffen, usw.?
Wie viel CPU wird von jedem meiner Threads verwendet? Sind sie effizient?
Und vielleicht noch andere Fragen oder Wünsche, auch zum Debuggen nur in einem einzelnen Thread, wie:
Ich wünschte, es wäre einfach, alle Methoden im Aufrufstapel in meinem Code hervorgehoben zu sehen
Ich wünschte, ich könnte einen Haltepunkt einfach nur auf einen bestimmten Thread anwenden
Ich wünschte, das Editor-Markup, das die aktuelle Code-Zeile anzeigt, sähe ein bisschen deutlicher aus
Ich wünschte, ich würde beim Anhalten des Prozesses nicht in die CPU-Ansicht wechseln, sondern nur meinen eigenen Quellcode sehen
Jede dieser Fragen wird von diesem neuen Plugin beantwortet.
Schauen wir uns seine Funktionen an. Im nächsten Abschnitt erfahren Sie mehr über die Ansicht „Parallele Threads“ und parallele Aufrufstapel, die Ausführung pro Thread und Stepping, die Ansicht „Prozess“, das neue Editor-Markup mit Threads und Aufrufstapeln im Editor, das Setzen der Thread-Affinität eines Haltepunkts, das Verschieben der aktuellen Ausführung, das neue Thread-Hauptmenü und vieles mehr…
Die Ansicht „Parallele Threads
Ansicht > Debug-Fenster > Parallele Threads
In diesem Fenster werden alle Threads des Prozesses in horizontaler Reihenfolge aufgelistet. Wenn Ihre App unter Windows läuft, hat jeder Thread ein Diagramm, das seine CPU-Auslastung anzeigt.
Wenn die App pausiert wird, zeigt jeder Thread seinen Aufrufstapel an.
Jedem Thread wird eine eindeutige Farbe zugewiesen, beginnend mit einem mittleren Blau für den Hauptthread der Anwendung. Diese Farbe wird als visuelle Hilfe verwendet, um den Thread überall zu identifizieren.
Thread-Namen werden angezeigt. Selbst wenn Sie Ihren Hauptthread nicht benennen, ist Parallel Debugger intelligent genug, um ihn zu erkennen.
Der aktuelle Thread ist fett gedruckt und wird von einem dünnen Rand in seiner Farbe umgeben. Doppelklicken Sie auf den Titel eines Threads (seinen Namen), um ihn zum aktuellen Thread zu machen.
Aufrufstapel-Einträge ohne Quellcode – d. h., sie sind ohne Verwendung der CPU-Ansicht nicht debuggingfähig – sind standardmäßig eingeklappt. Sie können diese ausklappen (oder ausschalten, um einen traditionellen Aufrufstapel anzuzeigen).
Wenn der Prozess angehalten wird, zeigt der Debugger immer den obersten debuggbaren Aufrufstack-Eintrag an. Das heißt, er zeigt vielleicht nicht den obersten Eintrag im Aufrufstapel, wie es die IDE traditionell tut, aber er zeigt den Quellcode von Ihnen, der ihn aufruft. Die Idee hier ist, das zu debuggen, worüber Sie die Kontrolle haben – zeigen Sie immer den Quellcode.
Die Schaltfläche ganz links in jeder Thread-Symbolleiste pausiert den gesamten Prozess und macht diesen Thread zum aktuellen Thread. Sie heißt ‚den Prozess in diesem Thread anhalten‘. Mit der Schaltfläche ganz rechts können Sie die Reihenfolge der angezeigten Threads ändern, indem Sie Threads nach links oder neben einen anderen angehefteten Thread anheften. Dies ist nützlich, wenn Sie viele Threads in Ihrer App haben und die, an denen Sie interessiert sind, in einer Gruppe zusammenfassen möchten. Wenn ein angehefteter Thread einen Namen hat, bleibt die Anheftung über Prozessneustarts hinweg bestehen: Wenn Sie Ihre App beenden und neu starten, werden die gleichen Threads angeheftet.
Ausführen oder Steppen eines einzelnen Threads
Die verbleibenden Schaltflächen der Symbolleiste sind für die Thread-Ausführungssteuerung.
Die normalen IDE-Steuerelemente „run“, „step over“, „step into“ usw. sind auf Prozessebene angesiedelt, d. h. sie lassen den gesamten Prozess laufen, wecken alle Threads auf und Sie hoffen einfach, dass nichts weiter passiert, bis die „step over“-Operation in dem Thread, den Sie betrachten, abgeschlossen ist. In der Praxis kann viel passieren – Ausnahmen, Haltepunkte usw. – und natürlich wollen Sie manchmal einfach nur sicherstellen, dass andere Threads nicht laufen, während Sie einen einzelnen Thread debuggen.
Mit diesen Schaltflächen in der Symbolleiste können Sie auf einer Pro-Thread-Ebene laufen und treten. Sie können:
Nur diesen Thread laufen lassen, alle anderen Threads pausieren lassen
Diesen Thread pausiert halten, aber alle anderen Threads laufen lassen
Schritt in eine Methode, nur in diesem Thread
Schritt über eine Codezeile, nur in diesem Thread. Dies erlaubt nur diesem Thread zu laufen und zu schreiten; keine anderen Threads dürfen zur gleichen Zeit laufen
Ausführen bis zur Rückkehr der Methode, nur für diesen Thread
Um diese zu verwenden, vergewissern Sie sich, dass das Thema, an dem Sie interessiert sind, das aktuelle Thema ist, indem Sie auf seinen Titel oder Namen doppelklicken. Sie werden sehen, dass der Titel fett gezeichnet ist.
Jede dieser Funktionen hat einen Tastaturkurzbefehl, d. h. Sie können die Schritte (usw.) über die Tastatur ausführen, nicht nur durch Anklicken einer Schaltfläche mit der Maus. Die Tastaturkürzel sind im Menü „Thread“ sichtbar, das Menüpunkte für den aktuellen Thread enthält (siehe unten).
Die Ablaufsteuerung pro Thread ist eine der leistungsstärksten Funktionen im Parallel Debugger.
Editor-Integration
Eine wichtige Aufgabe beim Verstehen der Vorgänge in einer Multithread-Anwendung ist es, zu wissen, wann mehrere Threads im selben Codebereich ausgeführt werden. Der Parallel Debugger macht dies durch das Hinzufügen von Markierungen im Editor für den vollständigen Aufrufstapel jedes Threads deutlich. Diese werden über „Tags“, kleine farbige Markierungen auf der rechten Seite des Editors, angezeigt.
Der oberste Call-Stack-Eintrag – also derjenige, an dem der Thread „jetzt“ ausgeführt wird – wird mit einem einfarbigen Tag in der Thread-Farbe markiert. Andere Aufrufstapel-Einträge für denselben Thread sind in einer verblassten Version der Thread-Farbe dargestellt (wobei der Thread immer noch mit einem durchgehenden Kreis im Tag markiert ist).
So können Sie Ihren Code schnell lesen und wissen: „Thread X wird irgendwo in dieser Codezeile ausgeführt“ und „Thread Y und Thread Z befinden sich beide gerade in der gleichen Methode“. Sie sehen sogar, wo sich die Threads genau befinden. In diesem Screenshot ist der aktuelle Thread der blaue, und ein zweiter Thread (hellrot) wird mit seinem aktuellen Ausführungspunkt innerhalb von IsPrime() ausgeführt, aber der Aufruf von IsPrime hat die Zeile über dem Ausführungspunkt des aktuellen Threads hervorgehoben.
Verschieben der Ausführung
Vor der Installation des Plugins hat die IDE den Ausführungspunkt des aktuellen Threads mit einem kleinen blauen Pfeil angezeigt. Dieser wird nun durch einen großen Chevron auf der linken Seite des Code-Editors ersetzt.
Sie können die Position des Ausführungspunkts ändern, d. h. die Stelle, an der der Thread das nächste Mal ausgeführt wird, wenn Sie auf „Run“ oder „Step“ klicken, indem Sie einfach auf diese Markierung klicken und sie verschieben.
Haltepunkt-Thread-Affinität
Standardmäßig gelten Haltepunkte für alle Threads. Vor der Installation des Plugins wurden Haltepunkte mit einem roten Punkt gezeichnet, aber mit dem Parallelen Debugger werden Threads Farben gegeben, und Rot bedeutet den roten Thread. Haltepunkte, die für alle Threads gelten, werden jetzt als ein mehrfarbiges Rad gezeichnet.
Um einen Haltepunkt nur für einen bestimmten Thread gelten zu lassen, klicken Sie mit der rechten Maustaste auf den Haltepunkt. Im neuen Haltepunktmenü können Sie einen Thread auswählen, für den der Haltepunkt gelten soll.
Hier gilt dieser Haltepunkt nur für den grünen Thread.
Die Prozessansicht
Ansicht > Debug-Fenster > Prozess
Dieses Fenster zeigt Informationen über den Prozess als Ganzes an. Es zeigt die CPU-Auslastung auf Prozessebene (wiederum aufgeteilt in Kernel- und Usermode), den Prozesstyp (z. B. Wow64) und hat Schaltflächen für Ausführen/Pause/Zurücksetzen usw. Diese sind auf Prozessebene, d.h. sie bieten die gleiche Funktionalität wie die IDE-eigene Ausführen-Symbolleiste.
Sie können auch eine Liste von Threads sehen, indem Sie auf die Schaltfläche am unteren Rand klicken, als schnelle Möglichkeit, den aktuellen Thread auszuwählen (da das horizontale Scrollen in der Threads-Ansicht länger dauern kann, wenn Sie viele Threads haben).
Das Thread-Hauptmenü
Die IDE verfügt jetzt über ein Thread-Menü, das sich rechts neben dem Ausführen-Menü befindet. Dieses bietet ein Menü für die meisten der direkten Operationen, die Sie für einen Thread durchführen können. Es lässt Sie den Thread von Interesse einstellen (d. h. den aktuellen Thread, wenn der Prozess angehalten ist, oder den Thread, der beim nächsten Anhalten zum aktuellen Thread werden soll), und für den aktuellen Thread gibt es Menüpunkte für die Thread-Laufkontrolle. Auf diesen Menüeinträgen sind Verknüpfungen zu sehen.
Außerdem werden alle Threads in der App aufgelistet, und für jeden wird die Ablaufsteuerung und das Anheften angezeigt, also praktisch die gleichen Funktionen wie in der Ansicht „Parallele Threads“.
Merkmal Level
Schließlich steuert der oberste Menüpunkt die Funktionsstufe des Parallel-Debuggers: was er tut, wenn Ihre App läuft. Die niedrigste Ebene dient nur zum Verfolgen der CPU-Auslastung: Verwenden Sie dies, wenn Sie den parallelen Debugger installieren möchten, ihn aber derzeit nicht aktiv für diese App verwenden wollen. Die nächsten beiden Stufen steuern, wie tief der Debugger Thread-Aufrufstapel verfolgt.
Verwenden Sie dies, wenn Sie Dutzende oder Hunderte von Threads haben. In dieser Situation sind Sie wahrscheinlich nur an einer Teilmenge von Threads interessiert. Wenn Sie die Funktionsstufe auf „Nur ausgewählte Aufrufstapel“ einstellen, verfolgt der parallele Debugger standardmäßig nur die Aufrufstapel für den Hauptthread, die angehefteten Threads und den aktuellen Thread. Sie können jederzeit den Aufrufstapel für jeden Thread abrufen, indem Sie auf eine Schaltfläche klicken, die über dem Aufrufstapelbereich in der Threads-Ansicht angezeigt wird.
Unterstützte Plattformen
Der Parallel Debugger hat die volle Funktionalität beim lokalen Debuggen von Anwendungen unter Windows.
Auf anderen Plattformen oder beim Remote-Debugging hängt die Funktionalität davon ab, was der Debugger unterstützt. Die CPU-Nutzung wird nur für lokale (nicht entfernt debuggende) Windows-Anwendungen unterstützt. Per-Thread-Stepping oder -Lauf wird nur auf Plattformen funktionieren, die Thread-Freezing unterstützen. Es gibt ein bekanntes Problem für C++ Win64, bei dem Aufrufstapel nicht ausgewertet werden können: dies wird in einer kommenden C++Builder-Version behoben.
Einer mit Bookmarks begonnenen Parnassus-Tradition folgend, behebt der Parallel Debugger tatsächlich einen Fehler! (RSP-29768.)
Generell gilt: Wenn Sie Windows verwenden, hat der Debugger volle Funktionalität.
Das Plugin unterstützt RAD Studio 10.4.1 (und neuer, wenn 10.4.2 herauskommt.)
Den parallelen Debugger erhalten
Der Parallele Debugger ist jetzt in GetIt!
Dank Embarcadero stellt Parnassus den Debugger jedem RAD Studio-Kunden mit aktivem Update-Abonnement kostenlos zur Verfügung. Öffnen Sie GetIt, gehen Sie zur Kategorie IDE-Plugins und klicken Sie auf Installieren.
Sowohl Parnassus als auch Embarcadero hoffen, dass Sie diese Erweiterung als großartige Ergänzung zu Ihrer IDE empfinden werden.
Persönlich möchte ich mich bei Embarcadero dafür bedanken, dass sie sich für das Plugin interessiert haben und es zu GetIt hinzufügen wollten, und bei all meinen Beta-Testern, die seit August verschiedene Versionen dieses Plugins von langsam steigender Qualität verwendet haben. Herzlichen Dank an alle!
#ifdef _WIN32
#include <tchar.h>
#else
typedef char _TCHAR;
#define _tmain main
#endif
#include <string>
#include <memory>
class employee {
// Lots of code here
};
struct person_id {
std::string first_name;
std::string last_name;
};
class employees {
public:
auto find_employee(const std::string& name) { return 1; }
};
int return_an_int() {
return 1;
}
auto return_something() {
return 1;
}
// The following will give a compiler error, because int and
// float are different types
//auto returnConfusion() {
// if (std::rand() %2 == 0) {
// return -1;
// } else {
// return 3.14159;
// }
//}
int main() {
auto i{ return_an_int() };
auto j{ return_something() };
// Example of a method with multiple return points, each with different types - an error
// auto k {returnConfusion()};
auto employee_list{ std::make_unique() };
auto person = employee_list->find_employee("Jane Smith");
system("pause");
return 0;
}
Fri Dec 11 2020 23:38:40 GMT+0700 (Western Indonesia Time)
На выставке Embarcadero Showcase представлен ряд замечательных программных решений, созданных нашими клиентами. Мы постоянно добавляем новые витрины. Цель демонстрации — показать успехи, которых достигают наши клиенты при использовании наших инструментов и решений, таких как RAD Studio, Delphi, C ++ Builder, InterBase и RAD Server. Вы можете представить свою собственную витрину, и мы можем показать ее, если будут доступны все необходимые материалы.
Отправить новую витрину очень просто. Просто посетите Форму подачи заявкина витрину и введите необходимую информацию и средства массовой информации. Краткое описание приложения, описывающее, как и почему программное решение использует Delphi, является оптимальным. Чтобы получить оценку для демонстрации, заявка должна включать доступ к скриншотам с разрешением 1080p или общедоступную загрузку (например, бесплатную пробную версию), чтобы можно было создавать скриншоты с высоким разрешением. Кроме того, их нужно использовать с последней версией Windows. Для мобильных приложений укажите URL-адреса App Store в описании и любые дополнительные снимки экрана, которые у вас могут быть. Вы также можете отправить URL-адрес YouTube с изображением вашего программного решения, и он может быть включен в демонстрацию.
Вот несколько существующих витрин, которые вы можете увидеть ниже.
WinSCP — это популярный отмеченный наградами собственный клиент SFTP, FTP-клиент и файловый менеджер для Microsoft Windows. Его скачали более 143 миллионов раз, и он доступен на многих языках. WinSCP построен на нескольких языках программирования, но C ++ Builder является основным инструментом, обеспечивающим его графический пользовательский интерфейс. Это отличный пример использования быстрой разработки пользовательского интерфейса C ++ Builder…
Broken Games — небольшая амбициозная независимая компания по разработке игр, базирующаяся в Берлине, Германия. Их флагманская игра Rise of Legions — это многопользовательская ролевая игра, доступная для платформы Windows. Соучредители Тобиас и Мартин сосредоточены на объединении людей с помощью игры …
EarMaster — это комплексное приложение потребительского уровня с необычайной функциональностью, в котором используются самые разные технологии. В нем почти 3000 уроков, созданных учителями музыки для начинающих и профессиональных музыкантов, играющих на любом инструменте. Несмотря на технологически продвинутую внутреннюю часть приложения, команда EarMaster много работала, чтобы сделать его максимально простым и интуитивно понятным в использовании. Возможности EarMaster…
Fri Dec 11 2020 23:38:25 GMT+0700 (Western Indonesia Time)
O Embarcadero Showcase apresenta uma série de diferentes soluções de software incríveis criadas por nossos clientes. Estamos adicionando novos mostruários o tempo todo. O objetivo do showcase é destacar os sucessos que nossos clientes estão obtendo ao usar nossas ferramentas e soluções, como RAD Studio, Delphi, C ++ Builder, InterBase e RAD Server. Você pode enviar seu próprio mostruário e poderemos apresentá-lo se toda a mídia necessária estiver disponível.
Enviar uma nova demonstração é fácil. Basta visitar o Formulário de envio de demonstração e inserir as informações e mídia necessárias. Uma breve descrição do aplicativo que descreve como e por que a solução de software usa Delphi é ideal. Para ser avaliado para um Showcase, o envio deve incluir acesso a capturas de tela com resolução de 1080p ou um download público (como uma avaliação gratuita) para que capturas de tela de alta resolução possam ser criadas. Além disso, eles precisam ser obtidos com a versão mais recente do Windows. Para aplicativos móveis, forneça os URLs da App Store na descrição e quaisquer capturas de tela extras que você possa ter. Você também pode enviar um URL do YouTube com sua solução de software e ele pode ser incluído no Showcase.
Aqui estão alguns Showcases existentes que você pode conferir abaixo.
WinSCP é um cliente SFTP nativo, cliente FTP e gerenciador de arquivos popular e premiado para Microsoft Windows. Ele foi baixado mais de 143 milhões de vezes e está disponível em vários idiomas. O WinSCP é construído com uma série de linguagens de programação, mas C ++ Builder é a principal ferramenta para sua interface gráfica de usuário. É um ótimo exemplo de como aproveitar o rápido desenvolvimento de IU do C ++ Builder …
Broken Games é uma pequena e ambiciosa empresa independente de desenvolvimento de jogos com sede em Berlim, Alemanha. Seu principal jogo, Rise of Legions, é um RPG multijogador disponível para a plataforma Windows. Os cofundadores Tobias e Martin se concentram em unir as pessoas por meio do jogo …
Com quase 3.000 aulas criadas por professores de música para iniciantes a músicos profissionais tocando qualquer instrumento, EarMaster é um aplicativo abrangente para o consumidor com funcionalidade extraordinária que usa uma variedade de tecnologias diferentes. Apesar do backend tecnologicamente avançado do aplicativo, a equipe EarMaster trabalhou duro para torná-lo o mais simples e intuitivo possível de usar. Recursos do EarMaster …
Fri Dec 11 2020 23:37:52 GMT+0700 (Western Indonesia Time)
Embarcadero Showcase presenta una variedad de increíbles soluciones de software creadas por nuestros clientes. Estamos agregando nuevas vitrinas todo el tiempo. El propósito de la exhibición es resaltar los éxitos que nuestros clientes están disfrutando al usar nuestras herramientas y soluciones como RAD Studio, Delphi, C ++ Builder, InterBase y RAD Server. Puede enviar su propio escaparate y podríamos presentarlo si todos los medios necesarios están disponibles.
Enviar una nueva presentación es fácil. Simplemente visite el Formulario de presentación de presentaciones e ingrese la información y los medios requeridos. Una breve descripción de la aplicación que describe cómo y por qué la solución de software utiliza Delphi es óptima. Para ser evaluado para un Showcase, el envío debe incluir acceso a capturas de pantalla de resolución 1080p o una descarga pública (como una prueba gratuita) para que se puedan crear capturas de pantalla de alta resolución. Además, deben tomarse con la última versión de Windows. Para aplicaciones móviles, proporcione las URL de la App Store en la descripción y las capturas de pantalla adicionales que pueda tener. También puede enviar una URL de YouTube con su solución de software y es posible que se incluya en la Presentación.
Aquí hay algunas vitrinas existentes que puede consultar a continuación.
WinSCP es un popular cliente SFTP nativo, cliente FTP y administrador de archivos para Microsoft Windows. Se ha descargado más de 143 millones de veces y está disponible en muchos idiomas. WinSCP está construido con varios lenguajes de programación, pero C ++ Builder es la herramienta principal que impulsa su interfaz gráfica de usuario. Es un gran ejemplo de cómo aprovechar el rápido desarrollo de la interfaz de usuario de C ++ Builder …
Broken Games es una pequeña y ambiciosa empresa de desarrollo de juegos independiente con sede en Berlín, Alemania. Su juego insignia, Rise of Legions, es un juego de rol multijugador disponible para la plataforma Windows. Los cofundadores Tobias y Martin se centran en unir a las personas a través del juego …
Con casi 3.000 lecciones creadas por profesores de música para principiantes y músicos profesionales que tocan cualquier instrumento, EarMaster es una aplicación completa para el consumidor con una funcionalidad extraordinaria que utiliza una variedad de tecnologías diferentes. A pesar del backend tecnológicamente avanzado de la aplicación, el equipo de EarMaster trabajó arduamente para que su uso sea lo más simple e intuitivo posible. Características de EarMaster …
Fri Dec 11 2020 23:37:31 GMT+0700 (Western Indonesia Time)
Der Embarcadero Showcase zeigt eine Reihe von verschiedenen Softwarelösungen, die von unseren Kunden erstellt wurden. Wir fügen laufend neue Showcases hinzu. Der Zweck des Showcase ist es, die Erfolge unserer Kunden hervorzuheben, die mit unseren Tools und Lösungen wie RAD Studio, Delphi, C++Builder, InterBase und RAD Server erzielt werden. Sie können Ihren eigenen Showcase einreichen und wir werden ihn möglicherweise veröffentlichen, wenn alle erforderlichen Medien vorhanden sind.
Das Einreichen eines neuen Showcase ist ganz einfach. Besuchen Sie einfach das Showcase-Einreichungsformular und geben Sie die erforderlichen Informationen und Medien ein. Eine kurze Beschreibung der App, die beschreibt, wie und warum die Softwarelösung Delphi nutzt, ist optimal. Um für einen Showcase bewertet zu werden, muss die Einreichung Zugang zu Screenshots in 1080p-Auflösung oder einen öffentlichen Download (z.B. eine kostenlose Testversion) enthalten, damit hochauflösende Screenshots erstellt werden können. Außerdem müssen sie mit der neuesten Version von Windows aufgenommen worden sein. Bei mobilen Apps geben Sie bitte die App-Store-URLs in der Beschreibung an und fügen Sie ggf. zusätzliche Screenshots bei. Sie können auch eine YouTube-URL mit Ihrer Softwarelösung einreichen, die in den Showcase aufgenommen werden kann.
Hier sind ein paar bestehende Showcases, die Sie sich ansehen können.
WinSCP ist ein beliebter, preisgekrönter nativer SFTP-Client, FTP-Client und Dateimanager für Microsoft Windows. Er wurde bereits über 143 Millionen Mal heruntergeladen und ist in vielen Sprachen verfügbar. WinSCP wurde mit einer Reihe von Programmiersprachen entwickelt, aber C++Builder ist das Hauptwerkzeug für die grafische Benutzeroberfläche. Es ist ein großartiges Beispiel für die Nutzung von C++Builders schneller UI-Entwicklung…
Broken Games ist eine kleine, aufstrebende, unabhängige Spielentwicklungsfirma mit Sitz in Berlin. Ihr Flaggschiff, Rise of Legions, ist ein Multiplayer-Rollenspiel für die Windows-Plattform. Die Mitgründer Tobias und Martin konzentrieren sich darauf, Menschen durch Spiele zusammenzubringen…
Mit fast 3.000 Lektionen, die von Musiklehrern für Anfänger bis hin zu professionellen Musikern, die ein beliebiges Instrument spielen, erstellt wurden, ist EarMaster eine umfassende App in Verbraucherqualität mit außergewöhnlicher Funktionalität, die eine Vielzahl verschiedener Technologien nutzt. Trotz des technologisch fortschrittlichen Backends der App hat das EarMaster-Team hart daran gearbeitet, die Anwendung so einfach und intuitiv wie möglich zu gestalten. EarMaster bietet…
Sind Sie bereit, Ihren eigenen Showcase einzureichen?
Thu Dec 10 2020 23:14:13 GMT+0700 (Western Indonesia Time)
Rapid PHP — это легкий редактор нативного кода и IDE для PHP в Windows, встроенный в Delphi. Согласно их сайту, «Rapid PHP-редактор — это более быстрый и более мощный редактор PHP-кода для Windows, сочетающий в себе функции полностью упакованной PHP IDE со скоростью Блокнота. Rapid PHP — это наиболее полное универсальное программное обеспечение для кодирования. PHP, HTML, CSS, JavaScript и другие языки веб-разработки с инструментами для отладки, проверки, повторного использования, навигации и форматирования вашего кода ». Он предлагает 6 различных языков локализации интерфейса и действительно огромное количество функций. В дополнение к PHP он имеет обширные возможности Javascript и CSS для создания универсальной платформы разработки для создания веб-приложений на PHP. Известные функции повышения производительности включают такие вещи, как «Редактировать / сохранять прямо на сервере FTP / SFTP / FTPS или быстро публиковать все измененные файлы», «Интеграция SVN и Git» и «Отладчик PHP (xDebug)».
Thu Dec 10 2020 23:13:56 GMT+0700 (Western Indonesia Time)
Rapid PHP é um editor de código nativo leve e IDE para PHP no Windows e é construído em Delphi. De acordo com o site, “Rapid PHP editor é um editor de código PHP mais rápido e poderoso para Windows combinando recursos de um IDE de PHP totalmente compactado com a velocidade do Bloco de notas. Rapid PHP é o software all-in-one mais completo para codificação PHP, HTML, CSS, JavaScript e outras linguagens de desenvolvimento web com ferramentas para depurar, validar, reutilizar, navegar e formatar seu código. ” Ele oferece 6 idiomas de localização diferentes para a interface e uma quantidade verdadeiramente enorme de recursos. Além de PHP, possui extensos recursos de Javascript e CSS para criar uma plataforma de desenvolvimento arredondada para a construção de aplicativos da web em PHP. Recursos de produtividade notáveis incluem coisas como “Editar / salvar diretamente no servidor FTP / SFTP / FTPS ou publicar rapidamente todos os arquivos alterados”, “integração SVN e Git” e “depurador PHP (xDebug)”.
Thu Dec 10 2020 23:13:21 GMT+0700 (Western Indonesia Time)
Rapid PHP es un editor de código nativo ligero e IDE para PHP en Windows y está construido en Delphi. Según su sitio, “Rapid PHP editor es un editor de código PHP más rápido y más potente para Windows que combina las características de un IDE PHP completo con la velocidad del Bloc de notas. Rapid PHP es el software todo en uno más completo para codificación PHP, HTML, CSS, JavaScript y otros lenguajes de desarrollo web con herramientas para depurar, validar, reutilizar, navegar y formatear su código “. Ofrece 6 idiomas de localización diferentes para la interfaz y una gran cantidad de funciones. Además de PHP, tiene amplias capacidades de Javascript y CSS para crear una plataforma de desarrollo completa para crear aplicaciones web en PHP. Las características de productividad notables incluyen cosas como “Editar / guardar directamente en el servidor FTP / SFTP / FTPS o publicar rápidamente todos los archivos modificados”, “Integración de SVN y Git” y “Depurador de PHP (xDebug)”.
Thu Dec 10 2020 23:12:56 GMT+0700 (Western Indonesia Time)
Rapid PHP ist ein leichtgewichtiger, nativer Code-Editor und eine IDE für PHP unter Windows und ist in Delphi aufgebaut. Auf der Website heißt es: „Rapid PHP editor ist ein schneller und leistungsfähiger PHP-Code-Editor für Windows, der die Funktionen einer voll ausgestatteten PHP-IDE mit der Geschwindigkeit des Notepad kombiniert. Rapid PHP ist die vollständigste All-in-One-Software für die Codierung von PHP, HTML, CSS, JavaScript und anderen Web-Entwicklungssprachen mit Tools zum Debuggen, Validieren, Wiederverwenden, Navigieren und Formatieren Ihres Codes.“ Es bietet 6 verschiedene Lokalisierungssprachen für die Benutzeroberfläche und eine wirklich massive Menge an Funktionen. Zusätzlich zu PHP verfügt es über umfangreiche Javascript- und CSS-Funktionen, um eine abgerundete Entwicklungsplattform für die Erstellung von Webanwendungen in PHP zu schaffen. Zu den bemerkenswerten Produktivitätsfunktionen gehören Dinge wie „Bearbeiten/Speichern direkt auf einem FTP/SFTP/FTPS-Server oder schnelles Veröffentlichen aller geänderten Dateien“, „SVN- und Git-Integration“ und „PHP-Debugger (xDebug)“.
Wed Dec 09 2020 15:18:47 GMT+0700 (Western Indonesia Time)
Hola a todos!
En esta breve presentación a continuación, traigo una revisión de nuestro Roadmap actualizado recientemente. Sabemos lo importante que es para nuestros clientes tener una visión clara de hacia dónde vamos con el producto, por eso creo que esta actualización es algo que realmente les gustará.
Además, esta presentación cubre las tres soluciones WEB que forman parte de nuestra oferta actual Free Web Pack. La presentación muestra un poco sobre cada framework (Intraweb, uniGUI, TMS Web Core) para ayudarlo a comprender sus capacidades y elegir el que mejor se adapte a sus requisitos.
¡Realmente espero que lo disfrutes y no dudes en contactar nos en caso de que necesites información adicional o alguna ayuda para seguir adelante con tus proyectos!
Y finalmente, aquí se puede encontrar la presentación en formato PDF con todos los enlaces:
Wed Dec 09 2020 11:26:43 GMT+0700 (Western Indonesia Time)
Innerhalb von nur vier Monaten konnte mit Delphi und RAD Server die Anwendung „Skarabäus“ von der Entwurfsphase bis zum Rollout entwickelt werden. Dabei wurde die Anbindung an das Backend einer Sicherheitsfirma neu erstellt, der RAD Server als perfekte Middleware eingebunden und die mobilen Apps für Android und iOS in Delphi mit FireMonkey programmiert.
Zernpfennig Informatik aus Österreich entwickelt seit vielen Jahren erfolgreich Desktop-, Web- und mobile Applikationen. Einer der Schwerpunkte liegt dabei im Bereich der Abfallwirtschaft.
Voraussetzung für die Anwendung „Skarabäus“ war eine Multi-Plattform Lösung, die sowohl im Android Play Store als auch im Apple App Store von den Bürgerinnen und Bürgern des Bezirks St. Pölten-Land downloadbar ist.
Mit den Apps erhalten die Nutzer nach erfolgreicher Registrierung sofort die Berechtigung zu jedem zutrittsbeschränkten Wertstoffzentrum der Mitgliedsgemeinden, auch außerhalb der regulären Öffnungszeiten.
Der Zutritt lässt sich bequem aus dem Auto über die App steuern. Zusätzliche Funktionalitäten, wie Anzeige der richtigen Entsorgung der einzelnen Abfallarten, unterstützen das richtige Trennen der Abfälle im Wertstoffzentrum.
RAD Studio mit Delphi und RAD Server haben sich bei einer kurzen Entwicklungszeit und einer Teamgröße von nur 5 Personen als eine ideale Kombination herausgestellt. Sowohl die Benutzeroberfläche für die mobilen Apps, als auch die Backend Programmierung wurden durch den Einsatz der gleichen Programmiersprache ohne Technologiebruch gelöst.
Wed Dec 09 2020 01:30:03 GMT+0700 (Western Indonesia Time)
Embarcadero Delphi / C++Builder / RAD Studio 10.4.2(コードネーム:Hunter)NDAベータプログラムへ、アップデートサブスクリプションが有効な全てのお客様を対象にご招待いたします。RAD Studio 10.4.2は、RAD Studio 10.4および10.4.1で導入された機能をベースに、製品全体に新機能と機能強化が加えられています。
10.4.2リリースに向けて計画している機能の詳細については、「RAD Studio 2020年11月付ロードマップのPM解説」を参照ください(ただし、ブログ記事で言及されている機能は、10.4.2がリリースされるまでその提供をお約束するものではありません)。
Tue Dec 08 2020 23:36:58 GMT+0700 (Western Indonesia Time)
Мы рады пригласить всех наших клиентов RAD Studio с активной подпиской на бета-программу NDA для выпуска Embarcadero 10.4.2 Delphi, C ++ Builder и RAD Studio под кодовым названием «Hunter». RAD Studio 10.4.2 основывается на замечательных функциях, представленных в RAD Studio 10.4 и 10.4.1, и добавляет новые функции и улучшения во всем продукте.
Чтобы узнать больше о возможностях, которые мы запланировали для выпуска 10.4.2, обратитесь к записи блога RAD Studio Roadmap PM Commentary за ноябрь 2020 г. (обратите внимание, что функции, упомянутые в сообщении блога, не используются до тех пор, пока не будут завершены и не выпущены GA). После того, как вы присоединились к бета-версии, вы получите дополнительную документацию с подробным описанием функций каждой бета-сборки.
Как присоединиться:
Для участия в бета — версии, пожалуйста , укажите ваше имя и адрес электронной почты , связанный с вашей подпиской на обновления (электронной почты , который вы использовали для регистрации продукта) , используя эту ф ОРМ во вторник, 15 декабря 2020 года.
После того, как вы предоставите свой адрес электронной почты, во второй половине декабря вы получите письмо со ссылкой для электронной подписи NDA бета-версии Hunter. После подписания NDA вам будет предоставлена информация, необходимая для участия в бета-версии 10.4.2. Обратите внимание, что бета-версии 10.4.2 не могут быть установлены на том же компьютере, что и ваша текущая установка 10.4 или 10.4.1 Sydney (также мы обычно не рекомендуем устанавливать бета-версии на производственную машину).
У вас нет подписки, но вы заинтересованы в участии в бета-версии 10.4.2? Обратитесь к торговому представителю Embarcadero или торговому посреднику, чтобы продлить подписку и получить приглашение присоединиться к бета-программе.
Tue Dec 08 2020 23:36:39 GMT+0700 (Western Indonesia Time)
Temos o prazer de convidar todos os nossos clientes RAD Studio com uma assinatura ativa do programa NDA beta para a versão 10.4.2 do Delphi, C ++ Builder e RAD Studio da Embarcadero, codinome “Hunter”. O RAD Studio 10.4.2 se baseia nos excelentes recursos introduzidos no RAD Studio 10.4 e 10.4.1 e adiciona novos recursos e aprimoramentos em todo o produto.
Para saber mais sobre os recursos que planejamos para a versão 10.4.2, consulte a postagem do blog RAD Studio November 2020 Roadmap PM Commentary (observe que os recursos mencionados na postagem do blog não são confirmados até que sejam concluídos e o GA seja liberado). Depois de ingressar no beta, você receberá documentação adicional detalhando os recursos de cada build beta.
Como entrar:
Para participar do beta, forneça o seu nome e o endereço de email associado à sua actualização de subscrição (o e-mail que você usou para registrar o produto) usando este f orm pelo terça-feira, 15 de dezembro, 2020 .
Depois de fornecer seu endereço de e-mail, você receberá um e-mail de acompanhamento na segunda quinzena de dezembro com um link para assinar eletronicamente o Hunter Beta NDA. Depois de assinar o NDA, você receberá as informações necessárias para participar do beta 10.4.2. Observe que as compilações beta 10.4.2 não podem ser instaladas na mesma máquina que sua instalação atual de Sydney 10.4 ou 10.4.1 (também, geralmente não recomendamos instalar versões beta em uma máquina de produção).
Não está atualizado com a assinatura, mas está interessado em ingressar no beta 10.4.2? Entre em contato com seu representante de vendas ou revendedor da Embarcadero para renovar sua assinatura e ser convidado a participar do programa beta.
Tue Dec 08 2020 23:36:04 GMT+0700 (Western Indonesia Time)
Nos complace invitar a todos nuestros clientes de RAD Studio con una suscripción activa al programa beta de NDA para la versión 10.4.2 de Embarcadero de Delphi, C ++ Builder y RAD Studio, con nombre en código “Hunter”. RAD Studio 10.4.2 se basa en las excelentes características introducidas en RAD Studio 10.4 y 10.4.1, y agrega nuevas características y mejoras en todo el producto.
Para obtener más información sobre las capacidades que hemos planeado para la versión 10.4.2, consulte la publicación de blog de comentarios de PM de la hoja de ruta de RAD Studio de noviembre de 2020 (tenga en cuenta que las funciones mencionadas en la publicación del blog no se comprometen hasta que se completen y se publique GA). Una vez que se haya unido a la versión beta, recibirá documentación adicional que detalla las características de cada versión beta.
Como unirse:
Para participar en la beta, por favor proporcione su nombre y la dirección de correo electrónico asociada a tu suscripción de actualización (el correo electrónico que utilizó para registrar el producto) usando esta forma para el martes, 15 de diciembre de, año 2020.
Una vez que haya proporcionado su dirección de correo electrónico, recibirá un correo electrónico de seguimiento en la segunda quincena de diciembre con un enlace para firmar electrónicamente el Hunter Beta NDA. Después de firmar el NDA, se le proporcionará la información necesaria para participar en la versión beta de 10.4.2. Tenga en cuenta que las compilaciones beta 10.4.2 no se pueden instalar en la misma máquina que su instalación actual de 10.4 o 10.4.1 Sydney (también, generalmente recomendamos no instalar versiones beta en una máquina de producción).
¿No estás al día con la suscripción pero estás interesado en unirte a la versión beta 10.4.2? Comuníquese con su representante de ventas o socio revendedor de Embarcadero para renovar su suscripción y ser invitado a unirse al programa beta.
Tue Dec 08 2020 23:35:51 GMT+0700 (Western Indonesia Time)
Wir freuen uns, alle RAD Studio-Kunden mit einem aktiven Abonnement zum NDA-Betaprogramm für die Version 10.4.2 von Delphi, C++Builder und RAD Studio von Embarcadero, Codename „Hunter“, einzuladen. RAD Studio 10.4.2 baut auf den großartigen Funktionen auf, die in RAD Studio 10.4 und 10.4.1 eingeführt wurden, und fügt neue Funktionen und Verbesserungen im gesamten Produkt hinzu.
Um mehr über die Funktionen zu erfahren, die wir für die Version 10.4.2 geplant haben, lesen Sie bitte den Blogbeitrag RAD Studio November 2020 Roadmap PM Commentary (bitte beachten Sie, dass die in dem Blogbeitrag erwähnten Funktionen erst nach Fertigstellung und GA-Freigabe verbindlich sind). Nachdem Sie der Beta beigetreten sind, erhalten Sie eine zusätzliche Dokumentation, in der die Funktionen der einzelnen Beta-Builds detailliert beschrieben sind.
Wie man beitritt:
Um an der Beta teilnehmen, geben Sie bitte Ihren Namen und die E – Mail – Adresse Ihr Update – Abonnement (die E – Mail den Sie das Produkt registrieren) mit diesem form bis Dienstag, 15. Dezember 2020.
Sobald Sie Ihre E-Mail-Adresse angegeben haben, erhalten Sie in der zweiten Dezemberhälfte eine Folge-E-Mail mit einem Link zur elektronischen Unterzeichnung der Hunter Beta NDA. Nach der Unterzeichnung der NDA erhalten Sie die Informationen, die Sie für die Teilnahme an der Beta 10.4.2 benötigen. Bitte beachten Sie, dass 10.4.2 Beta-Builds nicht auf demselben Computer wie Ihre aktuelle 10.4- oder 10.4.1 Sydney-Installation installiert werden können (wir empfehlen außerdem generell, Beta-Versionen nicht auf einem Produktionscomputer zu installieren).
Sie haben kein aktuelles Abonnement, sind aber daran interessiert, an der 10.4.2 Beta-Version teilzunehmen? Wenden Sie sich an Ihren Embarcadero-Vertriebsmitarbeiter oder -Handelspartner, um Ihr Abonnement zu verlängern und zur Teilnahme am Beta-Programm eingeladen zu werden.
procedure TForm1.FormActivate(Sender: TObject);
begin
if NotificationCenter1.AuthorizationStatus TAuthorizationStatus.Authorized
then
begin
// 通知リクエスト
NotificationCenter1.RequestPermission;
end;
end;
Tue Dec 08 2020 01:00:07 GMT+0700 (Western Indonesia Time)
「既存のC/SアプリケーションをWebに拡張したい」「Delphiの開発スキルを活かしてWebアプリケーションを構築したい」そんな要望に応えるWeb開発ソリューションを、Delphi / RAD Studio Enterprise以上を購入すると入手できる「Web Component Packキャンペーン」。2020年12月24日までの期間限定で実施中です。
キャンペーンの内容を少し説明すると、対象となるのは以下の4製品。
Delphi 10.4 Enterprise Web Component Packキャンペーン版
Delphi 10.4 Architect Web Component Packキャンペーン版
RAD Studio 10.4 Enterprise Web Component Packキャンペーン版
RAD Studio 10.4 Architect Web Component Packキャンペーン版
作成したアプリケーションがどのようにWebアプリケーションとして実装されるのかも注目すべきポイントです。TMS Web CoreとuniGUIは、構築したアプリケーションがHTML5とJavaScriptによって構成されるため、配置上の柔軟性も高まります。ちなみに、uniGUIは、Sencha Ext JSを内部で利用しており、Delphiのスキルを用いて、実質的にSenchaアプリケーションを構築していることになります。
Fri Dec 04 2020 23:35:39 GMT+0700 (Western Indonesia Time)
Enterprise или Architect Edition?
Если вы разработчик и задаетесь вопросом, стоит ли вам взглянуть на Enterprise или Architect Edition, (Что еще вы получаете? Полезно ли? Что еще вы можете сделать с Architect? Как использовать его для ускорения разработки?) .. этот вебинар для вас. Присоединяйтесь к команде Embarcadero и узнайте из первых рук, как разрабатывать быстрее с помощью дополнительных функций, включенных в версию RAD Studio Architect.
На этом заседании Стивен Болл, Мэри Келли и Алекс Руис обсудят и продемонстрируют высокопроизводительные инструменты и дополнительные функции версии Architect, а затем ответят на открытые вопросы и ответы. Сессия будет охватывать несколько этапов цикла разработки, показывая, как Aqua Data Studio, Sencha Architect, Ranorex, RAD Server и FireMonkey обеспечивают обнаружение данных, тестирование приложений, разработку среднего уровня, мобильную и веб-разработку.
15:00 GMT (Лондон)
10:00 EST (Нью-Йорк)
9:00 CST (Остин)
Вы знали!
Прямо сейчас, в течение ограниченного времени, вы можете купить версию Architect по цене Enterprise !! Ознакомьтесь с предложениями RAD для получения более подробной информации
Fri Dec 04 2020 23:35:25 GMT+0700 (Western Indonesia Time)
Enterprise ou Architect Edition?
Se você é um desenvolvedor e está se perguntando se deveria dar uma olhada na Enterprise ou Architect Edition, (qual extra você ganha? É útil? O que mais você pode fazer com o Architect? Como usá-lo para acelerar seu desenvolvimento?) Bem .. este webinar é para você. Junte-se à equipe da Embarcadero e veja em primeira mão como desenvolver mais rapidamente com os recursos extras incluídos na edição RAD Studio Architect.
Durante esta sessão, Stephen Ball, Mary Kelly e Alex Ruiz discutirão e demonstrarão as ferramentas altamente produtivas e recursos extras da edição Architect seguida por perguntas e respostas abertas. A sessão cobrirá várias fases do ciclo de desenvolvimento, mostrando como Aqua Data Studio, Sencha Architect, Ranorex, RAD Server e FireMonkey permitem a descoberta de dados, teste de aplicativo, camada intermediária, desenvolvimento móvel e web.
Fri Dec 04 2020 23:35:01 GMT+0700 (Western Indonesia Time)
¿Edición Enterprise o Architect?
Si eres un desarrollador y te preguntas si deberías mirar la edición Enterprise o Architect, (¿Qué extra obtienes? ¿Es útil? ¿Qué más puedes hacer con Architect? ¿Cómo usarlo para acelerar tu desarrollo?) .. este seminario web es para usted. Únase al equipo de Embarcadero y vea de primera mano cómo desarrollar más rápido con las funciones adicionales incluidas en la edición RAD Studio Architect.
A través de esta sesión, Stephen Ball, Mary Kelly y Alex Ruiz discutirán y demostrarán las herramientas altamente productivas y las características adicionales de la edición Architect, seguidas de preguntas y respuestas abiertas. La sesión cubrirá múltiples fases del ciclo de desarrollo, mostrando cómo Aqua Data Studio, Sencha Architect, Ranorex, RAD Server y FireMonkey permiten el descubrimiento de datos, las pruebas de aplicaciones, el desarrollo de nivel medio, móvil y web.
3 p.m. GMT (Londres)
10 a.m. EST (Nueva York)
9 a.m. CST (Austin)
¡Sabías!
¡Ahora mismo, solo por tiempo limitado, puede comprar la edición Architect por el precio de Enterprise ! Consulte las ofertas de RAD para obtener más detalles
Fri Dec 04 2020 23:34:46 GMT+0700 (Western Indonesia Time)
Enterprise oder Architect Edition?
Wenn Sie ein Entwickler sind und sich fragen, ob Sie sich die Enterprise oder Architect Edition ansehen sollten, (Was bekommen Sie zusätzlich? Ist es nützlich? Was können Sie mit Architect noch tun? Wie können Sie damit Ihre Entwicklung beschleunigen?), dann ist dieses Webinar genau das Richtige für Sie. Schließen Sie sich dem Embarcadero-Team an und erfahren Sie aus erster Hand, wie Sie mit den in der RAD Studio Architect Edition enthaltenen zusätzlichen Funktionen schneller entwickeln können.
In dieser Sitzung werden Stephen Ball, Mary Kelly und Alex Ruiz die hochproduktiven Tools und zusätzlichen Funktionen der Architect Edition diskutieren und vorführen, gefolgt von offenen Fragen und Antworten. Die Session deckt mehrere Phasen des Entwicklungszyklus ab und zeigt, wie Aqua Data Studio, Sencha Architect, Ranorex, RAD Server und FireMonkey Datenermittlung, App-Tests, Middle-Tier-, Mobile- und Web-Entwicklung ermöglichen.
Fri Dec 04 2020 16:56:27 GMT+0700 (Western Indonesia Time)
Традиционно в нашей стране покупки в конце года делаются для подарка с прицелом на будущее. Компания Embarcadero решила сама сделать подарки покупателям новых лицензий наших продуктов.
До конца этого года покупатели каждой новой лицензии RAD Studio или Delphi Enterprise или Architect бесплатно получат в придачу один из трех наборов для WEB-разработки от наших партнеров: IntraWeb, uniGUI или TMS Web Core по выбору покупателя.
RAD Studio и Delphi — практически единственный инструмент визуальной разработки кроссплатформенных приложений на базе единого кода для настольных, серверных и мобильных платформ. И вести действительно быструю разработку в визуальном режиме проектирования взаимодействия с пользователем. Но не следует забывать, что вы точно также можете пользоваться этими инструментами для создания полнофункциональных, гибких WEB-приложений в современном стиле привлекательно выглядящих страниц, реализованных на HTML, CSS, Javascript и т.п, чтобы пользователи работали в любом интернет-браузере. Нужно только взять соответствующий пакет и набор компонент от одного из наших технических партнеров или партнеров-производителей.
Главное достоинство таких решений — в том, что все привычные и наработанные методы работы с данными или обработки событий, вся логика работы алгоритмов (если вы, конечно, не «утопили» ее глубоко вместе с графическим представлением UI) могут остаться теми же самыми — в тех же самых модулях, а новые компоненты дадут вам возможность проектировать WEB-страницы и переводить эти дизайны в реализацию на HTML, CSS, javascript. Таким образом, разработчики Delphi могут реализовывать всю палитру ПО, необходимого для WEB-решений — fullstack разработка — или только одну из сторон таких распределенных систем — сервера, включая промежуточного уровня, или, наоборот, исключительно клиентские приложения.
Да, компания Embarcadero предлагает и другие высококлассные инструменты WEB-разработки, например, Sencha Ext JS — но эти инструменты требуют больших усилий на изучение и освоение, они сильно отличаются от RAD как по методикам, так и технологиям. В то же самое время, перечисленные WEB-пакеты уже содержат большинство шаблонов и стилей, которые применяются сегодня в WEB-разработке. Гибкость такого подхода позволяет получать приложения неотличимые от разработанных на популярных стандартных WEB-фреймворках.
В список партнерских пакетов WEB-разработки вошли известные и популярные продукты:
Каждый из них обладает большим числом преимуществ, каждый чем-то лучше другого. Наши коллеги провели сравнение возможностей и областей применения этих и нескольких других пакетов. Запись вебинара с обзором и сравнением пакетов WEB-разработки вы найдете по ссылке https://youtu.be/ks4Q_W5kwn4
Итак, только до конца декабря при покупке каждой новой лицензии RAD Studio / Delphi редакций Enterprise или Architect вы можете бесплатно получить один из перечисленных пакетов WEB-разработки. При заказе вы должны только указать, какой именно пакет вы выбрали.
Давайте в следующем году дадим пользователям еще более красивые, удобные и современные приложения!
Thu Dec 03 2020 23:34:13 GMT+0700 (Western Indonesia Time)
Сегодняшнее распространение инструментов для улучшения разработки программного обеспечения — повод для празднования. Многие замечательные люди ежедневно работают над созданием и распространением утилит, плагинов и IDE, которые упрощают нашу разработку! Однако оборотная сторона медали распространения описывает постоянную борьбу за определение лучшего инструмента как для текущей работы, так и для вашего будущего. Если вы когда-либо сталкивались с восемью фреймворками, конкурирующими за ваше внимание в одной и той же области программного обеспечения, и чувствовали паралич выбора, вы понимаете, насколько сложно может быть сделать этот важный личный и деловой выбор. Имея это в виду, мы приступаем к миссии по публикации серии официальных документов, в которых RAD Studio сравнивается и противопоставляется другим основным фреймворкам для разработки приложений, чтобы найти лучший долгосрочный выбор.. Наша аудитория — это как разработчики, которые должны хорошо понимать свой выбор, так и лица, принимающие решения, и бизнес-стратеги, ищущие структуру, которая будет поддерживать своевременную доставку, расширение в будущем и долгосрочную стабильность.
Методология
Для сравнения выбранных фреймворков будут использоваться пять тестовых приложений.
Простой калькулятор стилей Windows 10
GitHub недавний проводник
Проводник Windows
Читатель новостей Unicode RSS (с локальной базой данных)
Приложение для захвата экрана и истории
Каждое приложение включает в себя основные функции, выполняемые хорошей платформой, такие как дизайн пользовательского интерфейса, связь REST API, поддержка Unicode, поддержка баз данных и т. Д. Эти приложения будут разработаны экспертами в выбранных средах (добровольно для Delphi и заключены контракты на другие платформы) и оценены в соответствии с к основным метрикам проекта.
Метрики
Эти документы будут оценивать фреймворки с точки зрения производительности разработчиков , функциональности фреймворка , гибкости инструментов и производительности во время выполнения .
Продуктивность разработчиков — это мера усилий и кода, необходимых разработчикам для выполнения типичных задач разработки. Время, необходимое для выполнения задач разработки, влияет на доставку решения, а объем создаваемого кода влияет на усилия по обслуживанию (больше кода = больше ошибок). Производительность напрямую влияет на время вывода продукта на рынок и долгосрочные затраты на рабочую силу. Производительность будет измеряться путем сравнения начальной скорости разработки, окончательного времени сборки «быстрого запуска» и размера кода каждого тестового приложения, написанного в рассматриваемых средах.
Функциональность означает его пригодность для конкретной задачи, определяемой в этом проекте как его расширяемость и безопасность. Отличная функциональность фреймворка позволяет компаниям создавать собственные расширения на родном языке, а также защищать свой исходный код от использования. Функциональность фреймворка будет оцениваться в соответствии с его расширяемостью, сопротивляемостью декомпиляции и известными эксплойтами.
Гибкость означает широкий спектр задач, которые можно решить с помощью этого инструмента. Хотя IDE и фреймворки технически бесконечно гибки, поскольку в них можно разрабатывать все, что угодно, этот проект будет сосредоточен на кроссплатформенном использовании, сложности развертывания и требованиях, инструментах, интеграции с «магазинами приложений» и инструментах доступа к базе данных. Гибкость фреймворка позволяет разработчикам достигать своих целей с минимальным использованием других языков / инструментов и обеспечивает благодатную почву для надежного рынка сторонних инструментов . Гибкость будет качественно оценена на основе собственных возможностей каждой платформы, вариантов развертывания и предложений сторонних производителей.
Производительность во время выполнения позволяет конечным пользователям оценивать одно приложение по сравнению с другим с такими же функциями и интерфейсом. Компании, создающие приложения с превосходной безвременной производительностью, избегают неудовлетворенности клиентов за счет минимизации времени ожидания и использования ресурсов на медленных машинах. Производительность во время выполнения будет оцениваться по времени запуска, пиковому использованию памяти и среднему использованию памяти.
Дорожная карта проекта
Embarcadero планирует этот проект как итеративное сравнение RAD Studio, Delphi и C ++ Builder с другими фреймворками с целью стимулирования диалога с другими разработчиками фреймворков. Все исследования и данные будут опубликованы на GitHub для ознакомления другими. Первое сравнение проводится между библиотекой визуальных компонентов (VCL) RAD Studio и Windows Presentation Foundation (WPF) .NET с использованием тестового приложения Calculator. После этого мульти-прикладная среда FireMonkey от RAD Studio будет протестирована на Electron. Ожидайте, что будущие итерации продолжат работу над вышеупомянутыми тестовыми проектами, будут включать новые фреймворки и опираться на эти первоначальные документы, чтобы обеспечить всестороннее сравнение ведущих инструментов разработки 2020 года.
Thu Dec 03 2020 23:33:58 GMT+0700 (Western Indonesia Time)
A proliferação atual de ferramentas para aprimorar o desenvolvimento de software é um motivo de comemoração. Muitas pessoas incríveis trabalham diariamente para construir e distribuir utilitários, plug-ins e IDEs que tornam nosso desenvolvimento mais fácil! No entanto, o outro lado da moeda da proliferação descreve uma luta constante para identificar a melhor ferramenta para o trabalho atual e para o futuro. Se você já se deparou com oito estruturas competindo por sua atenção no mesmo domínio de software e sentiu paralisia de escolha, você entende como pode ser difícil fazer essa escolha pessoal e empresarial significativa. Com isso em mente, estamos embarcando na missão de publicar uma série de white papers que comparam e contrastam o RAD Studio com outras estruturas importantes para o desenvolvimento de aplicativos para descobrir a melhor escolha de longo prazo. Nosso público-alvo são desenvolvedores que devem entender intimamente sua ferramenta de escolha e também tomadores de decisão e estrategistas de negócios que buscam uma estrutura que oferecerá suporte a entrega no prazo, expansão futura e estabilidade de longo prazo.
Metodologia
Cinco aplicativos de referência serão usados para comparar as estruturas selecionadas
Calculadora simples estilo Windows 10
Explorador recente do GitHub
Explorador de arquivos do Windows
Leitor de notícias Unicode RSS (com banco de dados local)
Aplicação de captura de tela e histórico
Cada aplicativo incorpora funções básicas cumpridas por um bom framework, como design de UI, comunicação REST API, suporte Unicode, suporte de banco de dados, etc. Esses aplicativos serão desenvolvidos por especialistas nos frameworks selecionados (voluntários para Delphi e contratados para outros frameworks) e avaliados de acordo com às principais métricas do projeto.
Métricas
Esses documentos avaliarão as estruturas nas áreas de produtividade do desenvolvedor , funcionalidade da estrutura , flexibilidade da ferramenta e desempenho do tempo de execução .
Produtividade do desenvolvedor é a medida de esforço e código necessário para que os desenvolvedores concluam tarefas de desenvolvimento típicas. O tempo necessário para concluir as tarefas de desenvolvimento impacta a entrega da solução e o volume de código produzido impacta os esforços de manutenção (mais código = mais bugs). A produtividade impacta diretamente o tempo de chegada do produto ao mercado e os custos de mão de obra de longo prazo. A produtividade será medida comparando a velocidade de desenvolvimento inicial, o tempo de construção de “speedrun” final e o tamanho do código de cada aplicativo de benchmark escrito nas estruturas em questão.
Funcionalidade refere-se à sua adequação a uma tarefa específica, definida neste projeto como sua extensibilidade e segurança. A excelente funcionalidade do framework permite que as empresas criem suas próprias extensões na língua nativa e também protejam seu código-fonte contra exploração. A funcionalidade do framework será avaliada de acordo com sua extensibilidade nativa, resistência à descompilação e exploits conhecidos.
Flexibilidade se refere à amplitude de tarefas que podem ser realizadas com a ferramenta. Embora IDEs e estruturas sejam tecnicamente infinitamente flexíveis porque qualquer coisa pode ser desenvolvida dentro deles, este projeto se concentrará no uso de plataforma cruzada, complexidade e requisitos de implantação, ferramentas, integração com “lojas de aplicativos” e ferramentas de acesso a banco de dados. A flexibilidade da estrutura permite que os desenvolvedores atinjam seus objetivos com a incorporação mínima de outras linguagens / ferramentas e fornece um terreno fértil para um mercado robusto de ferramentas de terceiros . A flexibilidade será avaliada qualitativamente com base nos recursos nativos de cada estrutura, opções de implantação e ofertas de terceiros.
O Runtime Performance permite que os usuários finais julguem um aplicativo em comparação com outro com os mesmos recursos e interface. As empresas que criam aplicativos com desempenho de tempo superior evitam a insatisfação do cliente, minimizando os tempos de espera e o uso de recursos em máquinas lentas. O desempenho do tempo de execução será avaliado pelo tempo de inicialização, pico de uso de memória e uso médio de memória.
Roteiro do Projeto
A Embarcadero planeja este projeto como uma comparação iterativa entre RAD Studio, Delphi e C ++ Builder com outros frameworks, com o objetivo de estimular a conversa com outros desenvolvedores de framework. Todas as pesquisas e dados serão publicados no GitHub, para outros revisarem. A primeira comparação é entre a Visual Component Library (VCL) do RAD Studio e o Windows Presentation Foundation (WPF) .NET usando o aplicativo de benchmark Calculator. Em seguida, a estrutura de multi-aplicativos FireMonkey da RAD Studio será testada em relação ao Electron. Espere futuras iterações para continuar a trabalhar por meio dos projetos de referência mencionados acima, incorporar novas estruturas e construir sobre esses documentos iniciais para fornecer uma comparação abrangente das principais ferramentas de desenvolvimento de 2020.
Thu Dec 03 2020 23:33:22 GMT+0700 (Western Indonesia Time)
La proliferación actual de herramientas para mejorar el desarrollo de software es motivo de celebración. ¡Muchas personas increíbles trabajan a diario para crear y distribuir utilidades, complementos e IDE que facilitan nuestro desarrollo! Sin embargo, la otra cara de la moneda de la proliferación describe una lucha constante para identificar la mejor herramienta tanto para el trabajo actual como para su futuro. Si alguna vez se ha enfrentado a ocho marcos que compiten por su atención en el mismo dominio de software y ha sentido una parálisis de elección, comprende lo difícil que puede ser tomar esa importante decisión personal y empresarial. Con esto en mente, nos embarcamos en la misión de publicar una serie de documentos técnicos que comparan y contrastan RAD Studio con otros marcos importantes para el desarrollo de aplicaciones para eliminar la mejor opción a largo plazo.. Nuestra audiencia son tanto desarrolladores que deben comprender íntimamente su herramienta de elección como también tomadores de decisiones y estrategas comerciales que buscan un marco que respalde la entrega a tiempo, la expansión futura y la estabilidad a largo plazo.
Metodología
Se utilizarán cinco aplicaciones de referencia para comparar marcos seleccionados
Calculadora de estilo simple de Windows 10
Explorador reciente de GitHub
Explorador de archivos de Windows
Lector de noticias RSS Unicode (con base de datos local)
Aplicación de captura de pantalla e historial
Cada aplicación incorpora funciones básicas cumplidas por un buen framework como diseño de UI, comunicación REST API, soporte Unicode, soporte de base de datos, etc. Estas aplicaciones serán desarrolladas por expertos en los frameworks seleccionados (voluntarios para Delphi y contratados para otros frameworks) y evaluados según a las principales métricas del proyecto.
Métrica
Estos artículos evaluarán los marcos en las áreas de productividad del desarrollador , funcionalidad del marco , flexibilidad de herramientas y rendimiento en tiempo de ejecución .
La productividad del desarrollador es la medida de esfuerzo y código que necesitan los desarrolladores para completar las tareas de desarrollo típicas. El tiempo requerido para completar las tareas de desarrollo afecta la entrega de la solución y el volumen de código producido afecta los esfuerzos de mantenimiento (más código = más errores). La productividad impacta directamente en el tiempo de comercialización del producto y en los costos laborales a largo plazo. La productividad se medirá comparando la velocidad de desarrollo inicial, el tiempo de compilación final “speedrun” y el tamaño del código de cada aplicación de referencia escrita en los marcos temáticos.
La funcionalidad se refiere a su idoneidad para una tarea específica, definida dentro de este proyecto como su extensibilidad y seguridad. La excelente funcionalidad del marco permite a las empresas crear sus propias extensiones en el idioma nativo y también proteger su código fuente de la explotación. La funcionalidad del marco se evaluará de acuerdo con su extensibilidad nativa, resistencia a la descompilación y exploits conocidos.
La flexibilidad se refiere a la variedad de tareas que se pueden abordar con la herramienta. Si bien los IDE y los marcos son técnicamente infinitamente flexibles porque cualquier cosa podría desarrollarse dentro de ellos, este proyecto se centrará en el uso multiplataforma, la complejidad y los requisitos de implementación, las herramientas, la integración con “tiendas de aplicaciones” y las herramientas de acceso a la base de datos. La flexibilidad del marco permite a los desarrolladores alcanzar sus objetivos con una mínima incorporación de otros lenguajes / herramientas y proporciona un terreno fértil para un sólido mercado de herramientas de terceros . La flexibilidad se evaluará cualitativamente en función de las capacidades nativas de cada marco, las opciones de implementación y las ofertas de terceros.
Runtime Performance hace que los usuarios finales juzguen una aplicación frente a otra con las mismas características e interfaz. Las empresas que crean aplicaciones con un rendimiento superior en tiempo de ejecución evitan la insatisfacción del cliente al minimizar los tiempos de espera y el uso de recursos en máquinas lentas. El rendimiento en tiempo de ejecución se evaluará según el tiempo de inicio, el uso máximo de memoria y el uso promedio de memoria.
Hoja de ruta del proyecto
Embarcadero planea este proyecto como una comparación iterativa entre RAD Studio, Delphi y C ++ Builder con otros marcos, con el objetivo de estimular la conversación con otros desarrolladores de marcos. Toda la investigación y los datos se publicarán en GitHub para que otros los revisen. La primera comparación es entre Visual Component Library (VCL) de RAD Studio y Windows Presentation Foundation (WPF) .NET utilizando la aplicación de referencia Calculator. Después de eso, el marco de múltiples aplicaciones FireMonkey de RAD Studio se probará con Electron. Espere que las iteraciones futuras continúen trabajando a través de los proyectos de referencia antes mencionados, incorporen nuevos marcos y se basen en estos documentos iniciales para proporcionar una comparación completa de las principales herramientas de desarrollo de 2020.
Thu Dec 03 2020 23:33:09 GMT+0700 (Western Indonesia Time)
Die heutige Verbreitung von Tools zur Verbesserung der Softwareentwicklung ist ein Grund zum Feiern. Viele erstaunliche Leute arbeiten täglich daran, Dienstprogramme, Plug-Ins und IDEs zu erstellen und zu verteilen, die unsere Entwicklung erleichtern! Die andere Seite der Proliferationsmünze beschreibt jedoch einen ständigen Kampf, um das beste Werkzeug sowohl für den aktuellen Job als auch für Ihre Zukunft zu finden. Wenn Sie jemals mit acht Frameworks konfrontiert waren, die in derselben Software-Domäne um Ihre Aufmerksamkeit konkurrierten und eine Wahllähmung verspürten, wissen Sie, wie schwierig es sein kann, diese wichtige persönliche und geschäftliche Entscheidung zu treffen. Vor diesem Hintergrund beginnen wir mit der Veröffentlichung einer Reihe von White Papers, in denen RAD Studio mit anderen wichtigen Frameworks für die Anwendungsentwicklung verglichen und gegenübergestellt wird , um die beste langfristige Auswahl zu treffen. Unser Publikum sind sowohl Entwickler , die das Werkzeug ihrer Wahl genau verstehen müssen, als auch Entscheidungsträger und Geschäftsstrategen, die nach einem Rahmen suchen, der pünktliche Lieferung, zukünftige Expansion und langfristige Stabilität unterstützt.
Methodik
Fünf Benchmark-Anwendungen werden verwendet, um ausgewählte Frameworks zu vergleichen
Einfacher Rechner im Windows 10-Stil
GitHub aktueller Explorer
Windows-Datei-Explorer
Unicode RSS News Reader (mit lokaler Datenbank)
Bildschirmaufnahme- und Verlaufsanwendung
Jede Anwendung enthält grundlegende Funktionen, die von einem guten Framework wie UI-Design, REST-API-Kommunikation, Unicode-Unterstützung, Datenbankunterstützung usw. erfüllt werden. Diese Anwendungen werden von Experten in den ausgewählten Frameworks entwickelt (freiwillig für Delphi und für andere Frameworks unter Vertrag genommen) und entsprechend bewertet zu den Hauptprojektmetriken.
Metriken
Diese Papiere werden beurteilen Rahmenbedingungen in den Bereichen Entwicklerproduktivität , Framework – Funktionalität , Werkzeug Flexibilität und Laufzeitleistung .
Die Entwicklerproduktivität ist das Maß für Aufwand und Code, die Entwickler benötigen, um typische Entwicklungsaufgaben zu erledigen. Die für die Ausführung von Entwicklungsaufgaben erforderliche Zeit wirkt sich auf die Bereitstellung der Lösung aus, und das erzeugte Codevolumen wirkt sich auf den Wartungsaufwand aus (mehr Code = mehr Fehler). Die Produktivität wirkt sich direkt auf die Markteinführungszeit des Produkts und die langfristigen Arbeitskosten aus. Die Produktivität wird gemessen, indem die anfängliche Entwicklungsgeschwindigkeit, die endgültige „Speedrun“ -Erstellungszeit und die Codegröße jeder in den jeweiligen Frameworks geschriebenen Benchmark-Anwendung verglichen werden.
Funktionalität bezieht sich auf die Eignung für eine bestimmte Aufgabe, die in diesem Projekt als Erweiterbarkeit und Sicherheit definiert wird. Dank der hervorragenden Framework-Funktionalität können Unternehmen ihre eigenen Erweiterungen in der Muttersprache erstellen und ihren Quellcode vor Ausnutzung schützen. Die Framework-Funktionalität wird anhand ihrer nativen Erweiterbarkeit, Dekompilierungsresistenz und bekannten Exploits bewertet.
Flexibilität bezieht sich auf die Breite der Aufgaben, die mit dem Tool erledigt werden können. Während IDEs und Frameworks technisch unendlich flexibel sind, da alles in ihnen entwickelt werden kann, konzentriert sich dieses Projekt auf die plattformübergreifende Verwendung, die Komplexität und Anforderungen der Bereitstellung, Tools, die Integration in „App Stores“ und Tools für den Datenbankzugriff. Die Flexibilität des Frameworks ermöglicht es Entwicklern, ihre Ziele mit minimaler Einbeziehung anderer Sprachen / Tools zu erreichen, und bietet einen fruchtbaren Boden für einen robusten Tool-Markt von Drittanbietern . Die Flexibilität wird qualitativ anhand der nativen Funktionen, Bereitstellungsoptionen und Angebote von Drittanbietern bewertet.
Bei Runtime Performance beurteilen Endbenutzer eine Anwendung mit einer anderen mit denselben Funktionen und derselben Benutzeroberfläche. Unternehmen, die Anwendungen mit überlegener Laufzeitleistung erstellen, vermeiden Unzufriedenheit der Kunden, indem sie Wartezeiten und den Ressourcenverbrauch auf langsamen Maschinen minimieren. Die Laufzeitleistung wird anhand der Startzeit, der maximalen Speichernutzung und der durchschnittlichen Speichernutzung bewertet.
Projekt-Roadmap
Embarcadero plant dieses Projekt als iterativen Vergleich zwischen RAD Studio, Delphi und C ++ Builder mit anderen Frameworks, um die Konversation mit anderen Framework-Entwicklern zu fördern. Alle Forschungsergebnisse und Daten werden auf GitHub veröffentlicht, damit andere sie überprüfen können. Der erste Vergleich erfolgt zwischen der Visual Component Library (VCL) von RAD Studio und Windows Presentation Foundation (WPF) .NET unter Verwendung der Calculator-Benchmark-Anwendung. Anschließend wird das FireMonkey-Framework für mehrere Anwendungen von RAD Studio gegen Electron getestet. Erwarten Sie, dass zukünftige Iterationen die oben genannten Benchmark-Projekte weiterhin durcharbeiten, neue Frameworks einbeziehen und auf diesen ersten Papieren aufbauen, um einen umfassenden Vergleich der führenden Entwicklungswerkzeuge für 2020 zu ermöglichen.
Wed Dec 02 2020 23:32:54 GMT+0700 (Western Indonesia Time)
ALLPlayer — это мощный медиаплеер, который буквально воспроизводит практически все носители и форматы, с которыми вы сталкиваетесь в любой день, и он построен на Delphi. По данным ALLPlayer, его загрузили более 19 МИЛЛИОНОВ. Он может обрабатывать форматы 3G2, AVI, MKV, AVI, FLV, DAT, MOV, M2TS, MP4, 3GP, VOB, MPG, APE, AU, MKA, MP3, OGG, WAV и AC3, а также DVD, аудио компакт-диски, анимированные GIF-файлы и любые указанные вами ссылки. Основные функции ALLPlayer включают поддержку подавляющего большинства видео и аудио медиа и форматов, а также автоматический поиск и загрузку соответствующих субтитров для ваших медиа файлов. Сопутствующее приложение, также встроенное в Delphi, — это ALLMediaServer, которое позволяет вам смотреть фильмы, слушать музыку или просматривать фотографии с вашего компьютера на телевизоре, смартфоне или другом устройстве, совместимом с Samsung AllShare DLNA.
Wed Dec 02 2020 23:32:39 GMT+0700 (Western Indonesia Time)
ALLPlayer é um poderoso software reprodutor de mídia que irá literalmente reproduzir quase todas as mídias e formatos que você encontrar em um determinado dia e é construído em Delphi. De acordo com ALLPlayer, teve mais de 19 MILHÕES de downloads. Ele pode lidar com os formatos 3G2, AVI, MKV, AVI, FLV, DAT, MOV, M2TS, MP4, 3GP, VOB, MPG, APE, AU, MKA, MP3, OGG, WAV e AC3, bem como DVDs, CDs de áudio, GIFs animados e qualquer link que você especificar. Os principais recursos do ALLPlayer incluem suporte à grande maioria das mídias e formatos de vídeo e áudio E pesquisa e baixa automaticamente as legendas correspondentes para seus arquivos de mídia. Um aplicativo complementar também integrado ao Delphi é o ALLMediaServer, que permite assistir filmes, ouvir música ou ver fotos do computador na TV, smartphone ou outro dispositivo compatível com Samsung AllShare DLNA.
Wed Dec 02 2020 23:32:05 GMT+0700 (Western Indonesia Time)
ALLPlayer es un poderoso software de reproducción de medios que literalmente reproducirá casi todos los medios y formatos que encuentre en un día determinado y está integrado en Delphi. Según ALLPlayer, ha tenido más de 19 MILLONES de descargas. Puede manejar formatos 3G2, AVI, MKV, AVI, FLV, DAT, MOV, M2TS, MP4, 3GP, VOB, MPG, APE, AU, MKA, MP3, OGG, WAV y AC3, así como DVD, CD de audio, GIF animados y cualquier enlace que especifique. Las características principales de ALLPlayer incluyen la compatibilidad con la gran mayoría de los medios y formatos de video y audio Y busca y descarga automáticamente subtítulos coincidentes para sus archivos multimedia. Una aplicación complementaria también incorporada en Delphi es ALLMediaServer que le permite ver películas, escuchar música o ver fotos desde su computadora en su televisor, teléfono inteligente u otro dispositivo compatible con Samsung AllShare DLNA.
Wed Dec 02 2020 23:31:44 GMT+0700 (Western Indonesia Time)
ALLPlayer ist eine leistungsstarke Media-Player-Software, die buchstäblich fast alle Medien und Formate abspielt, die Ihnen im Alltag begegnen, und sie ist in Delphi gebaut. Nach ALLPlayer hat es über 19 MILLIONEN Downloads gehabt. Er kann mit den Formaten 3G2, AVI, MKV, AVI, FLV, DAT, MOV, M2TS, MP4, 3GP, VOB, MPG, APE, AU, MKA, MP3, OGG, WAV und AC3 umgehen, ebenso wie mit DVDs, Audio-CDs, animierten GIFs und jedem Link, den Sie angeben. Zu den Hauptfunktionen von ALLPlayer gehört die Unterstützung der überwiegenden Mehrheit von Video- und Audiomedien und -formaten UND die automatische Suche und das Herunterladen von passenden Untertiteln für Ihre Mediendateien. Eine Begleit-App, die ebenfalls in Delphi entwickelt wurde, ist der ALLMediaServer, mit dem Sie Filme ansehen, Musik hören oder Fotos von Ihrem Computer auf Ihrem Fernseher, Smartphone oder einem anderen Gerät, das mit Samsung AllShare DLNA kompatibel ist, betrachten können.
Brotli(ブロトリ)とは、LZ77アルゴリズムをベースとしたデータ圧縮方式で、データフォーマットの仕様はインターネット標準である「RFC 7932」の一部として、すでにIETFによって定義されており、WOFF(Web Open Font Format) 2.0のフォント形式での圧縮方式としても採用されています。
Recently, I've been invited to Google DevFest to deliver a presentation on our experiences working with Kubernetes.
Below I talk about an online learning and streaming platform where the decision to use Kubernetes has been contested both internally and externally since the beginning of its development.
The application and its underlying infrastructure were designed to meet the needs of the regulations of several countries:
The app should be able to run on-premises, so students’ data could never leave a given country. Also, the app had to be available as a SaaS product as well.
It can be deployed as a single-tenant system where a business customer only hosts one instance serving a handful of users, but some schools could have hundreds of users.
Or it can be deployed as a multi-tenant system where the client is e.g. a government and needs to serve thousands of schools and millions of users.
The application itself was developed by multiple, geographically scattered teams, thus a Microservices architecture was justified, but both the distributed system and the underlying infrastructure seemed to be an overkill when we considered the fact that during the product's initial entry, most of its customers needed small instances.
Was Kubernetes suited for the job, or was it an overkill? Did our client really need Kubernetes?
Let’s figure it out.
(Feel free to check out the video presentation, or the extended article version below!)
Let's talk a bit about Kubernetes itself!
Kubernetes is an open-source container orchestration engine that has a vast ecosystem. If you run into any kind of problem, there's probably a library somewhere on the internet that already solves it.
But Kubernetes also has a daunting learning curve, and initially, it's pretty complex to manage. Cloud ops / infrastructure engineering is a complex and big topic in and of itself.
Kubernetes does not really mask away the complexity from you, but plunges you into deep water as it merely gives you a unified control plane to handle all those moving parts that you need to care about in the cloud.
So, if you're just starting out right now, then it's better to start with small things and not with the whole package straight away! First, deploy a VM in the cloud. Use some PaaS or FaaS solutions to play around with one of your apps. It will help you gradually build up the knowledge you need on the journey.
So you want to decide if Kubernetes is for you.
First and foremost, Kubernetes is for you if you work with containers! (It kinda speaks for itself for a container orchestration system). But you should also have more than one service or instance.
Kubernetes makes sense when you have a huge microservice architecture, or you have dedicated instances per tenant having a lot of tenants as well.
Also, your services should be stateless, and your state should be stored in databases outside of the cluster. Another selling point of Kubernetes is the fine gradient control over the network.
And, maybe the most common argument for using Kubernetes is that it provides easy scalability.
Okay, and now let's take a look at the flip side of it.
Kubernetes is not for you if you don't need scalability!
If your services rely heavily on disks, then you should think twice if you want to move to Kubernetes or not. Basically, one disk can only be attached to a single node, so all the services need to reside on that one node. Therefore you lose node auto-scaling, which is one of the biggest selling points of Kubernetes.
For similar reasons, you probably shouldn't use k8s if you don't host your infrastructure in the public cloud. When you run your app on-premises, you need to buy the hardware beforehand and you cannot just conjure machines out of thin air. So basically, you also lose node auto-scaling, unless you're willing to go hybrid cloud and bleed over some of your excess load by spinning up some machines in the public cloud.
If you have a monolithic application that serves all your customers and you need some scaling here and there, then cloud service providers can handle it for you with autoscaling groups.
There is really no need to bring in Kubernetes for that.
Let's see our Kubernetes case-study!
Maybe it's a little bit more tangible if we talk about an actual use case, where we had to go through the decision making process.
Online Learning Platform is an application that you could imagine as if you took your classroom and moved it to the internet.
You can have conference calls. You can share files as handouts, you can have a whiteboard, and you can track the progress of your students.
This project started during the first wave of the lockdowns around March, so one thing that we needed to keep in mind is that time to market was essential.
In other words: we had to do everything very, very quickly!
This product targets mostly schools around Europe, but it is now used by corporations as well.
So, we're talking about millions of users from the point we go to the market.
The product needed to run on-premise, because one of the main targets were governments.
Initially, we were provided with a proposed infrastructure where each school would have its own VM, and all the services and all the databases would reside in those VMs.
Handling that many virtual machines, properly handling rollouts to those, and monitoring all of them sounded like a nightmare to begin with. Especially if we consider the fact that we only had a couple of weeks to go live.
After studying the requirements and the proposal, it was time to call the client to..
Discuss the proposed infrastructure.
So the conversation was something like this:
"Hi guys, we would prefer to go with Kubernetes because to handle stuff at that scale, we would need a unified control plane that Kubernetes gives us."
"Yeah, sure, go for it."
And we were happy, but we still had a couple of questions:
"Could we, by any chance, host it on the public cloud?"
"Well, no, unfortunately. We are negotiating with European local governments and they tend to be squeamish about sending their data to the US. "
Okay, anyways, we can figure something out...
"But do the services need filesystem access?"
"Yes, they do."
Okay, crap! But we still needed to talk to the developers so all was not lost.
Let's call the developers!
It turned out that what we were dealing with was an usual microservice-based architecture, which consisted of a lot of services talking over HTTP and messaging queues.
Each service had its own database, and most of them stored some files in Minio.
In case you don't know it, Minio is an object storage system that implements the S3 API.
Now that we knew the fine-grained architectural layout, we gathered a few more questions:
"Okay guys, can we move all the files to Minio?"
"Yeah, sure, easy peasy."
So, we were happy again, but there was still another problem, so we had to call the hosting providers:
"Hi guys, do you provide hosted Kubernetes?"
"Oh well, at this scale, we can manage to do that!"
So, we were happy again, but..
Just to make sure, we wanted to run the numbers!
Our target was to be able to run 60 000 schools on the platform in the beginning, so we had to see if our plans lined up with our limitations!
We shouldn't have more than 150 000 total pods!
10 (pod/tenant) times 6000 tenants is 60 000 Pods. We're good!
We shouldn't have more than 300 000 total containers!
It's one container per pod, so we're still good.
We shouldn't have more than 100 pods per node and no more than 5 000 nodes.
Well, what we have is 60 000 pods over 100 pod per node. That's already 6 000 nodes, and that's just the initial rollout, so we're already over our 5 000 nodes limit.
Okay, well... Crap!
But, is there a solution to this?
Sure, it's federation!
We could federate our Kubernetes clusters..
..and overcome these limitations.
We have worked with federated systems before, so Kubernetes surely provides something for that, riiight? Well yeah, it does... kind of.
It's the stable Federation v1 API, which is sadly deprecated.
Then we saw that Kubernetes Federation v2 is on the way!
It was still in alpha at the time when we were dealing with this issue, but the GitHub page said it was rapidly moving towards beta release. By taking a look at the releases page we realized that it had been overdue by half a year by then.
Since we only had a short period of time to pull this off, we really didn't want to live that much on the edge.
So what could we do? We could federate by hand! But what does that mean?
In other words: what could have been gained by using KubeFed?
Having a lot of services would have meant that we needed a federated Prometheus and Logging (be it Graylog or ELK) anyway. So the two remaining aspects of the system were rollout / tenant generation, and manual intervention.
Manual intervention is tricky. To make it easy, you need a unified control plane where you can eyeball and modify anything. We could have built a custom one that gathers all information from the clusters and proxies all requests to each of them. However, that would have meant a lot of work, which we just did not have the time for. And even if we had the time to do it, we would have needed to conduct a cost/benefit analysis on it.
The main factor in the decision if you need a unified control plane for everything is scale, or in other words, the number of different control planes to handle.
The original approach would have meant 6000 different planes. That’s just way too much to handle for a small team. But if we could bring it down to 20 or so, that could be bearable. In that case, all we need is an easy mind map that leads from services to their underlying clusters. The actual route would be something like:
Service -> Tenant (K8s Namespace) -> Cluster.
The Service -> Namespace mapping is provided by Kubernetes, so we needed to figure out the Namespace -> Cluster mapping.
This mapping is also necessary to reduce the cognitive overhead and time of digging around when an outage may happen, so it needs to be easy to remember, while having to provide a more or less uniform distribution of tenants across Clusters. The most straightforward way seemed to be to base it on Geography. I’m the most familiar with Poland’s and Hungary’s Geography, so let’s take them as an example.
Poland comprises 16 voivodeships, while Hungary comprises 19 counties as main administrative divisions. Each country’s capital stands out in population, so they have enough schools to get a cluster on their own. Thus it only makes sense to create clusters for each division plus the capital. That gives us 17 or 20 clusters.
So if we get back to our original 60 000 pods, and 100 pod / tenant limitation, we can see that 2 clusters are enough to host them all, but that leaves us no room for either scaling or later expansions. If we spread them across 17 clusters - in the case of Poland for example - that means we have around 3.500 pods / cluster and 350 nodes, which is still manageable.
This could be done in a similar fashion for any European country, but still needs some architecting when setting up the actual infrastructure. And when KubeFed becomes available (and somewhat battle tested) we can easily join these clusters into one single federated cluster.
Great, we have solved the problem of control planes for manual intervention. The only thing left was handling rollouts..
As I mentioned before, several developer teams had been working on the services themselves, and each of them already had their own Gitlab repos and CIs. They already built their own Docker images, so we simply needed a place to gather them all, and roll them out to Kubernetes. So we created a GitOps repo where we stored the helm charts and set up a GitLab CI to build the actual releases, then deploy them.
From here on, it takes a simple loop over the clusters to update the services when necessary.
The other thing we needed to solve was tenant generation.
It was easy as well, because we just needed to create a CLI tool which could be set up by providing the school's name, and its county or state.
That's going to designate its target cluster, and then push it to our Gitops repo, and that basically triggers the same rollout as new versions.
We were almost good to go, but there was still one problem: on-premises.
Although our hosting providers turned into some kind of public cloud (or something we can think of as public clouds), we were also targeting companies who want to educate their employees.
Huge corporations - like a Bank - are just as squeamish about sending their data out to the public internet as governments, if not more..
So we needed to figure out a way to host this on servers within vaults completely separated from the public internet.
In this case, we had two main modes of operation.
One is when a company just wanted a boxed product and they didn't really care about scaling it.
And the other one was where they expected it to be scaled, but they were prepared to handle this.
In the second case, it was kind of a bring your own database scenario, so you could set up the system in a way that we were going to connect to your database.
And in the other case, what we could do is to package everything — including databases — in one VM, in one Kubernetes cluster. But! I just wrote above that you probably shouldn't use disks and shouldn't have databases within your cluster, right?
However, in that case, we already had a working infrastructure.
Kubernetes provided us with infrastructure as code already, so it only made sense to use that as a packaging tool as well, and use Kubespray to just spray it to our target servers.
It wasn't a problem to have disks and DBs within our cluster because the target were companies that didn't want to scale it anyway.
So it's not about scaling. It is mostly about packaging!
Previously I told you, that you probably don't want to do this on-premises, and this is still right! If that's your main target, then you probably shouldn't go with Kubernetes.
However, as our main target was somewhat of a public cloud, it wouldn't have made sense to just recreate the whole thing - basically create a new product in a sense - for these kinds of servers.
So as it is kind of a spin-off, it made sense here as well as a packaging solution.
Basically, I've just given you a bullet point list to help you determine whether Kubernetes is for you or not, and then I just tore it apart and threw it into a basket.
And the reason for this is - as I also mentioned:
Cloud ops is difficult!
There aren't really one-size-fits-all solutions, so basing your decision on checklists you see on the internet is definitely not a good idea.
We've seen that a lot of times where companies adopt Kubernetes because it seems to fit, but when they actually start working with it, it turns out to be an overkill.
If you want to save yourself about a year or two of headache, it's a lot better to first ask an expert, and just spend a couple of hours or days going through your use cases, discussing those and save yourself that year of headache.
In case you're thinking about adopting Kubernetes, or getting the most out of it, don't hesitate to reach out to us at info@risingstack.com, or by using the contact form below!
Tue Dec 01 2020 14:32:59 GMT+0700 (Western Indonesia Time)
Seguindo a tradição, passado o Conference (virtual) deste ano de 2020, levamos ao ar na semana anterior as palestras melhores avaliadas pelo público, além do Keynote de Marco, David e Jim.
Além de uma amostra do conteúdo do Conference, de altíssimo nível por sinal, também tivemos um track extra, cobrindo:
Roadmap Update (Novembro/2020)
Estratégias Desenvolvimento WEB
Free Web Pack
IntraWeb (Atozed)
uniGUI (FMSoft)
WEB Core (TMS)
Este vídeo em particular pode ser acessado diretamente aqui:
Conforme mencionado durante a apresentação, o objetivo aqui foi apresentar estes três frameworks (IntraWeb, uniGUI e Web Core) para aqueles que ainda não se aventuraram com o desenvolvimento web.
Durante a campanha vigente, um destes frameworks, em sua versão mais completa, pode ser seu na aquisição de uma licença Enterprise ou Architect do Delphi, C++ Builder ou RAD Studio!
Tue Dec 01 2020 00:18:39 GMT+0700 (Western Indonesia Time)
Das 3D Train Studio ist eine einfach zu bedienende Anwendung zur Planung Ihrer perfekten Modelleisenbahn und wurde in Delphi erstellt. Mit 3D Train Studio können Benutzer ihre eigenen einzigartigen, detaillierten Layouts auf ihrem PC mit Tausenden von Gleisen zur Auswahl konstruieren. Sie können Landschaften bestehend aus Bergen und Tälern erstellen, Häuser und Bäume entlang von Straßen und Wegen platzieren und ihre eigenen Miniaturwelten mit realistischen 3D-Grafiken und in Echtzeit konstruieren. Die Benutzer können auch in ihre virtuellen Modelleisenbahnen einsteigen und den kompletten Bahnbetrieb, einschließlich animierter Schranken, Signale und Straßenfahrzeuge, automatisch oder durch speziell definierte Ereignisse simulieren. „Ohne Delphi hätten wir 3D Train Studio nie so effizient und mit einer so eleganten Benutzeroberfläche entwickeln können“, so Stefan Werner von 3D Train Studio.
Auf der technischen Seite nutzt 3D Train Studio viele verschiedene Technologien, wie z.B. eine selbstgeschriebene 3D-Engine, die in der Lage ist, Tausende von 3D-Objekten in Echtzeit mit Abstraktion der zugrundeliegenden Grafik-API (unterstützt Direct3D 9 und 11) zu rendern, Tonverarbeitung mit Hilfe der FMOD-Bibliothek, XML-RPC, Multi-Threading mit benutzerdefiniertem geschriebenem Task-Manager, benutzerdefinierte VCL-Komponenten für einen reibungslosen Bildbetrachter, XML-Verarbeitung, Mehrsprachenunterstützung (derzeit Englisch und Deutsch) und eine saubere Trennung von UI, Logik und Daten (MVC).
Tue Dec 01 2020 00:18:24 GMT+0700 (Western Indonesia Time)
3D Train Studio es una aplicación fácil de usar para planificar su modelo de ferrocarril perfecto y está construido en Delphi. Con 3D Train Studio, los usuarios pueden construir sus propios diseños únicos y detallados en sus PC con miles de pistas para elegir. Pueden crear paisajes formados por montañas y valles, colocar casas y árboles a lo largo de calles y carreteras y construir sus propios mundos en miniatura, con gráficos 3D realistas y en tiempo real. Los usuarios también pueden abordar sus trenes modelo virtuales y simular operaciones ferroviarias completas, incluidas barreras animadas, señales y vehículos de carretera, de forma automática o mediante eventos especialmente definidos. “Nunca podríamos haber desarrollado 3D Train Studio de manera tan eficiente y con una interfaz de usuario tan elegante sin Delphi”, dijo Stefan Werner de 3D Train Studio.
Desde el punto de vista técnico, 3D Train Studio utiliza muchas tecnologías diferentes, como un motor 3D autoescrito capaz de renderizar miles de objetos 3D en tiempo real con abstracción de la API de gráficos subyacente (compatible con Direct3D 9 y 11), procesamiento de sonido con la ayuda de la biblioteca FMOD, XML-RPC, subprocesos múltiples con administrador de tareas escrito personalizado, componentes VCL personalizados para un visor de imágenes sin problemas, procesamiento XML, soporte en varios idiomas (actualmente inglés y alemán) y una separación limpia de UI, lógica y datos (MVC).
Tue Dec 01 2020 00:17:50 GMT+0700 (Western Indonesia Time)
O 3D Train Studio é um aplicativo fácil de usar para planejar seu modelo ferroviário perfeito e é construído em Delphi. Com o 3D Train Studio, os usuários podem construir seus próprios layouts detalhados e exclusivos em seus PCs com milhares de pistas para escolher. Eles podem criar paisagens consistindo de montanhas e vales, colocar casas e árvores ao longo de ruas e estradas e construir seus próprios mundos em miniatura, com gráficos 3D realistas e em tempo real. Os usuários também podem embarcar em seus trens-modelo virtuais e simular operações ferroviárias completas, incluindo barreiras animadas, sinais e veículos rodoviários, automaticamente ou por eventos especialmente definidos. “Nunca poderíamos ter desenvolvido o 3D Train Studio com tanta eficiência e com uma interface de usuário tão elegante sem o Delphi”, disse Stefan Werner, do 3D Train Studio.
Do lado técnico, o 3D Train Studio utiliza muitas tecnologias diferentes, como um mecanismo 3D escrito por ele mesmo capaz de renderizar milhares de objetos 3D em tempo real com abstração da API gráfica subjacente (com suporte para Direct3D 9 e 11), processamento de som com a ajuda da biblioteca FMOD, XML-RPC, multi-threading com gerenciador de tarefas escrito personalizado, componentes VCL personalizados para um visualizador de imagens suave, processamento XML, suporte a vários idiomas (atualmente inglês e alemão) e uma separação limpa de UI, lógica e dados (MVC).
Tue Dec 01 2020 00:17:24 GMT+0700 (Western Indonesia Time)
3D Train Studio — это простое в использовании приложение для планирования идеальной модели железной дороги, созданное на Delphi. С помощью 3D Train Studio пользователи могут создавать свои собственные уникальные подробные макеты на своих ПК с тысячами треков на выбор. Они могут создавать пейзажи, состоящие из гор и долин, размещать дома и деревья вдоль улиц и дорог и создавать свои собственные миниатюрные миры с реалистичной трехмерной графикой и в режиме реального времени. Пользователи также могут садиться в свои виртуальные модели поездов и моделировать полные железнодорожные операции, включая анимированные барьеры, сигналы и дорожные транспортные средства, автоматически или с помощью специально определенных событий. «Мы никогда не смогли бы разработать 3D Train Studio так эффективно и с таким элегантным интерфейсом без Delphi», — сказал Стефан Вернер из 3D Train Studio.
С технической стороны, 3D Train Studio использует множество различных технологий, таких как самописный 3D-движок, способный рендерить тысячи 3D-объектов в режиме реального времени с абстракцией базового графического API (с поддержкой Direct3D 9 и 11), обработка звука с помощью помощь библиотеки FMOD, XML-RPC, многопоточность с настраиваемым написанным диспетчером задач, настраиваемые компоненты VCL для удобного просмотра изображений, обработка XML, многоязычная поддержка (в настоящее время английский и немецкий) и четкое разделение пользовательского интерфейса, логики и данные (MVC).
Tue Dec 01 2020 00:17:13 GMT+0700 (Western Indonesia Time)
TwineCompile — это продвинутая система компиляции, которая использует технологию многопоточности и методы кэширования, чтобы ваш C ++ Builder компилировал в 50 раз быстрее! Этот подключаемый модуль IDE предоставляется бесплатно с активной подпиской на обновления для всех клиентов C ++ Builder и RAD Studio через диспетчер пакетов GetIt. Установите TwineCompile прямо сейчас из GetIt до вебинара , чтобы вы могли легко следить за тем, как Джонатан демонстрирует возможности TwineCompile .
Веб-семинар Deep Dive: повышение скорости компиляции C ++ Builder с помощью TwineCompile
Из командной строки RAD Studio с повышенными привилегиями вы можете установить его с помощью команды:
getitcmd -i=TwineCompile-5.2.1
Другие особенности TwineCompile:
Механизм автоматической фоновой компиляции гарантирует, что файлы компилируются так же быстро, как и сохраняются!
Хорошо настроенная, предварительно скомпилированная система обработки заголовков автоматически максимизирует одновременное использование предварительно скомпилированных заголовков между несколькими потоками!
Полная интеграция с C ++ Builder 10.4 Sydney IDE
Поддержка тем для всех тем IDE, обеспечивающая единое рабочее пространство!
Полная поддержка 32-битных и 64-битных компиляторов!
Зарегистрируйтесь сейчас для участия в углубленном веб-семинаре, чтобы максимально повысить продуктивность C ++ Builder и вывести скорость компиляции на новый уровень
Tue Dec 01 2020 00:16:55 GMT+0700 (Western Indonesia Time)
TwineCompile é um sistema de compilação avançado que usa tecnologia multi-threading e técnicas de cache para tornar a compilação do C ++ Builder 50x mais rápida! Este plug-in IDE está incluído gratuitamente com uma assinatura de atualização ativa para todos os clientes C ++ Builder e RAD Studio por meio do Gerenciador de pacotes GetIt. Instale TwineCompile hoje a partir do GetIt , antes do webinar, para que você possa acompanhar facilmente enquanto Jonathan demonstra o poder do TwineCompile .
Webinar de mergulho profundo: aumente a velocidade de compilação do C ++ Builder com TwineCompile
14 de dezembro de 2020 às 11h CST / 1700 UTC [ Registrar ]
com Jonathan Benedicto da JomiTech, criador do TwineCompile
Em um prompt de comando elevado do RAD Studio, você pode instalá-lo com o comando:
getitcmd -i=TwineCompile-5.2.1
Outros recursos do TwineCompile:
O mecanismo de compilação automática de plano de fundo garante que os arquivos sejam compilados tão rápido quanto são salvos!
Um sistema de manipulação de cabeçalhos pré-compilado altamente ajustado maximiza automaticamente o uso simultâneo de cabeçalhos pré-compilados entre vários threads!
Integração perfeita com o IDE C ++ Builder 10.4 Sydney
Suporte de tema para todos os temas IDE, fornecendo um espaço de trabalho unificado!
Suporte total para compiladores de 32 e 64 bits!
Registre-se agora para o webinar aprofundado para maximizar sua produtividade C ++ Builder e aumentar suas velocidades de compilação a novos patamares.
Tue Dec 01 2020 00:16:12 GMT+0700 (Western Indonesia Time)
TwineCompile es un sistema de compilación avanzado que utiliza tecnología de subprocesos múltiples y técnicas de almacenamiento en caché para hacer que su C ++ Builder compile 50 veces más rápido. Este complemento IDE se incluye gratis con una suscripción de actualización activa para todos los clientes de C ++ Builder y RAD Studio a través del GetIt Package Manager. Instale TwineCompile hoy mismo desde GetIt , antes del seminario web , para que pueda seguir fácilmente mientras Jonathan demuestra el poder de TwineCompile .
Seminario web de análisis profundo: Aumente la velocidad de compilación de C ++ Builder con TwineCompile
14 de diciembre de 2020 a las 11 a. M. CST / 1700 UTC [ Registrarse ]
con Jonathan Benedicto de JomiTech, creador de TwineCompile
Desde un símbolo del sistema de RAD Studio elevado, puede instalarlo con el comando:
getitcmd -i=TwineCompile-5.2.1
Otras características de TwineCompile:
El motor de compilación automática en segundo plano garantiza que los archivos se compilen tan rápido como se guardan.
Un sistema de manejo de encabezados altamente ajustado y precompilado maximiza automáticamente el uso simultáneo de encabezados precompilados entre múltiples subprocesos.
Integración perfecta en C ++ Builder 10.4 Sydney IDE
Soporte de temas para todos los temas IDE que brindan un espacio de trabajo unificado.
Soporte completo para compiladores de 32 y 64 bits.
Regístrese ahora para el seminario web de análisis profundo para maximizar su productividad de C ++ Builder y disparar sus velocidades de compilación a nuevas alturas.
Tue Dec 01 2020 00:15:52 GMT+0700 (Western Indonesia Time)
TwineCompile ist ein fortschrittliches Kompilierungssystem, das Multithreading-Technologie und Caching-Techniken verwendet, um Ihren C++Builder 50-mal schneller zu kompilieren! Dieses IDE-Plugin ist kostenlos in einem aktiven Update-Abonnement für alle C++Builder- und RAD Studio-Kunden über den GetIt Package Manager enthalten. Installieren Sie TwineCompile noch heute vor dem Webinar von GetIt , damit Sie Jonathan problemlos die Leistung von TwineCompile vorführen können .
Deep Dive Webinar: Steigern Sie die Kompilierungsgeschwindigkeit von C++Builder mit TwineCompile
14. Dezember 2020 um 11 Uhr CST / 1700 UTC [ Register ]
mit Jonathan Benedicto von JomiTech, dem Erfinder von TwineCompile
An einer erhöhten RAD Studio-Eingabeaufforderung können Sie sie mit dem folgenden Befehl installieren:
getitcmd -i=TwineCompile-5.2.1
Weitere TwineCompile-Funktionen:
Die automatische Hintergrundkompilierungs-Engine stellt sicher, dass Dateien so schnell kompiliert werden, wie sie gespeichert werden!
Ein hoch abgestimmtes, vorkompiliertes Header-Handling-System maximiert automatisch die gleichzeitige Verwendung vorkompilierter Header zwischen mehreren Threads!
Nahtlose Integration in die C++Builder 10.4 Sydney IDE
Themenunterstützung für alle IDE-Themen, die einen einheitlichen Arbeitsbereich bieten!
Volle Unterstützung für 32-Bit- und 64-Bit-Compiler!
Melden Sie sich jetzt für das Deep-Dive-Webinar an, um Ihre C++Builder-Produktivität zu maximieren und Ihre Kompilierungsgeschwindigkeit auf ein neues Niveau zu heben.
TwineCompile führt eine automatische Hintergrundkompilierung (SORTA) in C++Builder 10.4 Sydney durch.
TwineCompile Erstellen eines Projekts in C++Builder 10.4 Sydney mithilfe des Dark Theme.
Mon Nov 30 2020 00:15:21 GMT+0700 (Western Indonesia Time)
За последние три десятилетия компания RockWare, Inc., расположенная в Голдене, Колорадо, зарекомендовала себя как лидер в узкоспециализированном секторе геологического картирования и моделирования. Его флагманский продукт, RockWorks, создает трехмерные геологические модели недр земли для заказчиков в сегментах окружающей среды (очистка от токсинов, аудит загрязнения), гидрогеологии (поверхностные и подземные воды) и промышленных минералов (например, гипс, песчаный гравий) и он построен в Delphi. Одно из ключевых преимуществ Delphi, по словам Джима Рида, директора по исследованиям и разработкам, заключается в том, что «он позволяет нам размещать миллионы строк кода и делать это эффективно, не перегружая память. Из-за этого у нас может быть программа-монстр, которая выполняет 50 миллиардов разных вещей, но которую можно удобно загрузить за разумное время. Учитывая, что 65% нашего бизнеса находится за пределами Северной Америки, исполняемые файлы должны быть достаточно маленькими, чтобы кто-то в Судане мог загружать данные через паршивое соединение ». Он приписывает эту возможность функциям наложения в Delphi, которые обеспечивают исключительное управление памятью. «Delphi позволяет легко загружать и выгружать объекты в памяти, поэтому наше программное обеспечение может работать на любой базовой машине. Фактически, с ПК младшего класса вы могли бы запустить наше приложение за час. Мы не могли жить без этого ».
Mon Nov 30 2020 00:15:02 GMT+0700 (Western Indonesia Time)
Nas últimas três décadas, a RockWare, Inc., sediada em Golden, Colorado, se estabeleceu como líder no setor de mapeamento e modelagem geológica altamente especializado. Seu principal produto, RockWorks, cria modelos geológicos tridimensionais da subsuperfície da Terra para clientes em segmentos ambientais (limpeza de tóxicos, auditorias de contaminação), hidrogeologia (água superficial e subterrânea) e minerais industriais (por exemplo, gesso, cascalho de areia) e é construído em Delphi. Um dos principais benefícios do Delphi, de acordo com Jim Reed, Diretor de P&D, é que “Ele nos permite inserir milhões de linhas de código e fazê-lo de maneira eficiente, sem esgotar a memória. Por causa disso, podemos ter um programa monstro que faz 50 zilhões de coisas diferentes, mas pode ser baixado confortavelmente em um período de tempo razoável. Dado que 65% do nosso negócio está fora da América do Norte, os arquivos executáveis devem ser pequenos o suficiente para que alguém no Sudão possa baixar dados por meio de uma conexão ruim. ” Ele atribui essa capacidade aos recursos de sobreposição no Delphi, que permitem um gerenciamento de memória excepcional. “O Delphi permite que você carregue e descarregue coisas facilmente na memória para que nosso software possa ser executado em qualquer máquina básica. Na verdade, com um PC de baixo custo, você pode ter nosso aplicativo instalado e funcionando em uma hora. Não poderíamos viver sem isso. ”
Mon Nov 30 2020 00:14:22 GMT+0700 (Western Indonesia Time)
Durante las últimas tres décadas, RockWare, Inc., con sede en Golden, Colorado, se ha establecido como líder en el sector de modelado y mapeo geológico altamente especializado. Su producto estrella, RockWorks, crea modelos geológicos tridimensionales del subsuelo de la tierra para clientes en segmentos ambientales (limpieza tóxica, auditorías de contaminación), hidrogeología (agua superficial y subterránea) y minerales industriales (por ejemplo, yeso, arena y grava) y está construido en Delphi. Uno de los beneficios clave de Delphi, según Jim Reed, director de I + D, es que “nos permite introducir millones de líneas de código y hacerlo de forma eficiente sin agotar la memoria. Por eso, podemos tener un programa monstruoso que hace 50 trillones de cosas diferentes, pero que se puede descargar cómodamente en un tiempo razonable. Dado que el 65% de nuestro negocio está fuera de América del Norte, los archivos ejecutables deben ser lo suficientemente pequeños para que alguien en Sudán pueda descargar datos a través de una conexión pésima “. Atribuye esta capacidad a las funciones de superposición de Delphi, que permiten una gestión de memoria excepcional. “Delphi le permite cargar y descargar cosas fácilmente en la memoria para que nuestro software pueda ejecutarse en cualquier máquina básica. De hecho, con una PC de gama baja, podría tener nuestra aplicación en funcionamiento en una hora. No podríamos vivir sin eso “.
Mon Nov 30 2020 00:13:46 GMT+0700 (Western Indonesia Time)
Im Laufe der letzten drei Jahrzehnte hat sich das in Golden, Colorado, ansässige Unternehmen RockWare, Inc. als führendes Unternehmen im Bereich der hochspezialisierten geologischen Kartierung und Modellierung etabliert. Sein Vorzeigeprodukt RockWorks erstellt 3-dimensionale geologische Modelle des Erduntergrunds für Kunden in den Bereichen Umwelt (Giftstoffsanierung, Kontaminationsprüfungen), Hydrogeologie (Oberflächen- und Untergrundwasser) und Industriemineralien (z. B. Gips, Sandkies) und wird in Delphi gebaut. Einer der Hauptvorteile von Delphi ist laut Jim Reed, Direktor für Forschung und Entwicklung, dass „es uns ermöglicht, Millionen von Codezeilen einzugeben und dies auf effiziente Weise zu tun, ohne den Speicherplatz zu überfordern. Dadurch können wir ein Monsterprogramm haben, das 50 Zillionen verschiedene Dinge tut, aber bequem und in angemessener Zeit heruntergeladen werden kann. Angesichts der Tatsache, dass 65 Prozent unseres Geschäfts außerhalb Nordamerikas liegen, müssen ausführbare Dateien klein genug sein, damit jemand im Sudan Daten über eine lausige Verbindung herunterladen kann“. Er führt diese Fähigkeit auf die Overlay-Funktionen in Delphi zurück, die eine außergewöhnliche Speicherverwaltung ermöglichen. „Delphi erlaubt es Ihnen, Dinge im Speicher einfach zu laden und zu entladen, so dass unsere Software auf jedem Basisrechner laufen kann. Mit einem Low-End-PC könnten Sie unsere Anwendung in einer Stunde zum Laufen bringen. Ohne das könnten wir nicht leben.“
Fri Nov 27 2020 13:36:45 GMT+0700 (Western Indonesia Time)
„Rise of Legions ist ein Hybrid aus MOBA, Turmverteidigung und Deckbuilding – schnelle Action, einfacher Einstieg, Tug-Of-War-Strategie! Spiele allein oder bring einen Freund mit für den Co-Op-Modus oder 2vs2, sammle mächtige Karten, baue vielfältige Decks und bezwinge deine Kontrahenten! “ so beschreiben die Game Entwickler von Broken Games kurz das in Delphi entwickelt Rollenspiel.
Als Martin Lange und Tobias Tenbusch ihre eigene Spielefirma gründeten, waren sie auf der Suche nach einer Entwicklungsumgebung und einer Programmiersprache mit hoher Leistung, schneller Kompilierung plus einer herausragenden Lesbarkeit und Wartungsfähigkeit des Programmcodes. Schließlich wurden sie fündig – mit Delphi. Broken Games hat zunächst die Verwendung der Unity-Engine geprüft, musste aber bald feststellen, dass diese zu teuer ist und auch nicht zuverlässig. Schließlich entschied man sich für die Entwicklung einer eigenen Game-Engine mit Delphi.
Bereits im Januar 2019 hatte eine frühe Version von „Rise of Legions“ über 100.000 Abonnenten. Die Teilnahme an dem Spiel ist kostenlos, Upgrades zu Skins, Spielfortschritt und weiteren Features sind kostenpflichtig. Auf Steam gibt es durchweg sehr positive Beurteilungen.
Fri Nov 27 2020 12:52:16 GMT+0700 (Western Indonesia Time)
Ansgar Becker entwickelt seit 1999 mittels Delphi einen schlanken Datenbank-Client. Anfangs nur für MySQL gedacht, hat HeidiSQL sich im Laufe der Jahre weltweit als ein sehr beliebtes und häufig genutztes OpenSource Werkzeug auch für SQL Server, PostgreSQL und SQLite etabliert. Zu den leistungsstarken Funktionen gehören das Herstellen von Verbindungen über SSH-Tunnel, das Erstellen und Bearbeiten von Tabellen, Ansichten, gespeicherten Prozeduren, Triggern und mehr. Es besteht die Möglichkeit SQL-Exporte direkt von einem Server auf einen anderen durchzuführen, inklusive Benutzerrechte. Weitere Export Formate sind CSV, HTML, XML, SQL, LaTeX, Wiki Markup und PHP Array. Eine beeindruckende Software, die durch jedes Delphi-Update unzählige Verbesserungen bekommen hat!
Fri Nov 27 2020 06:18:27 GMT+0700 (Western Indonesia Time)
During my studies at ThePowerMBA I was introduced to the concept of Unit Economics. The main goal is to define clear metrics to measure the performance of our business, including the measurement of our costs, our revenues and our profits.
I will present below the main metrics, with a brief explanation for each, and then discuss my personal experience at my own startup company, KashKlik, an innovative Influencer Marketing platform.
Measuring Costs
CAC
The Customer Acquisition Cost (CAC) measures how much we are spending to acquire a new customer. In order to calculate the CAC, for a given period of time, we must know how much was spent on acquiring new customers and how many customers did we acquire.
Customer Based Calculation (CAC):
Total acquisition costs ( time ) / # of new customers per ( time )
We can also calculate the cost per action performed by the customers, which in general is the amount of money we need to spend in order to generate a sale or some other form of conversion (such as a registration or a subscription to our services).
Sales Based Calculation (CPA, “cost per action”):
Total acquisition costs ( time ) / # of new sales per ( time )
Measuring Revenues
CLTV
The Customer Lifetime Value (CLTV) measures how much total value we are getting from every customer. In other words, the CLTV measures the total value that one customer generates over their lifetime as a customer.
CLTV Calculation:
“lifetime” revenues per customer X Gross margin (%)
ARPU
The Average Revenue Per User (ARPU) measures how much revenue we are getting from a customer in a certain time period. The ARPU is a key metric in recurring revenue models.
Calculating the ARPU:
Revenue (per time period) / # of users (per time period)
CHURN RATE
The Churn Rate measures how many customers (percentually) we are losing in a period of time. The Churn Rate is also a very important metric in recurring business models.
Calculating the Churn Rate:
# of customer lost (in the period) / # customers at the start of the period
Measuring Profitability
CLTV – CAC
The difference between the CLTV and the CAC enables us to calculate how much profit we make off of each customer. By increasing this difference, we make our business more profitable.
CLTV / CAC
The ratio between the CLTV and the CAC enables us to calculate how much we multiply our acquisition investment by. This ratio represents our return on CAC investments.
CAC PAYBACK
The CAC Payback measures how long it takes to make back our CAC investment. This is the average amount of time that passes between investing money in CAC (acquiring customers) and getting it back.
The CAC Payback may be calculated as:
CAC / ARPU
The Unit Metrics in Practice
Measuring Costs in Practice
As we defined above, the CAC is a very important metric, and if we are not measuring the CAC we cannot even be sure if our business is profitable (since all the profitability metrics are related to the CAC). However, in practice, there may be multiple customer acquisition channels, and we should be able to measure the CAC for each one of these channels.
For example, one channel may be campaigns on Google AdWords, a second channel may be Facebook Ads and a third channel may be Influencer Marketing campaigns. Each one of these channels will probably have a different CAC, and so we should develop mechanisms to be able to measure it precisely. In other words, we should track where our customers are coming from, and have specific CAC measures per channel, instead of a single generic CAC value.
After we have clear CAC measurements, and we observe that some channels are more expensive than others, we have basically two choices:
Continue using only the channel that provides us the cheapest CAC, and stop using the other channels that are more expensive.
Try to improve the performance of the more expensive channels, through fine-tuning of the campaign parameters and the targeting.
Measuring Revenue in Practice
In general in order to measure the CLTV we should use several other metrics that depend on the behavior and the kind of transactions being performed by our customers. These are some of the metrics we may need in practice in order to obtain the CLTV:
What is the expected lifetime of our customers? For how long do we expect that our customers will be active?
What is the observed frequency of transactions? How many transactions do our customers perform in a specific period of time?
What is the average amount of money each customer spends on each transaction?
So for example if we measure that the average lifetime of our customers is 10 months, and that they perform transactions twice per month, spending in average U$ 35 per transaction, their CLTV will be: 10 X 2 X 35 = U$ 700
In practice, it may be necessary to do this analysis by separating our customers in different segments. We may discover that we have one customer segment with a very high CLTV while another segment has a much lower CLTV. Then, we should observe which one of these segments is growing faster, and check if the different segments are growing at similar rates.
One common problem for startup companies is that they are able to attract early adopters that are enthusiastic about their product, and thus have a very high CLTV. However, when they try to expand to other customer segments, they discover that these new customers have a very different behavior than the early adopters, and as a consequence a much lower CLTV.
Measuring Profits in Practice
Our profitability metrics are based on relationships between the CAC and the CLTV, but as we observed above, in practice the CAC may be very different depending on the channel being used for customer acquisition, and the CLTV may be very different depending on the customer segment being measured.
So ideally we should try to build a matrix to measure the profits depending on both the customer acquisition channel and the customer segment.
Below I give you an example of 3 acquisition channels and 3 customer segments with the respective profitability computation.
The first table has the CAC per acquisition channel:
Customer Acquisition Channel
CAC
Google AdWords
U$ 10
Facebook Ads
U$ 12
Influencer Marketing
U$ 18
The second table has the CLTV per customer segment:
Customer Segment
CLTV
Enthusiastic Users
U$ 120
Regular Users
U$ 80
Low-Frequency Users
U$ 40
The third table has the user segments per acquisition channel:
Acquisition Channel
Enthusiastic
Regular
Low-Frequency
Google AdWords
10%
60%
30%
Facebook Ads
20%
60%
20%
Influencer Marketing
40%
50%
10%
Then we can compute the profit per acquisition channel:
Acquisition Channel
Weighted Average CLTV
CAC
CLTV – CAC
Google AdWords
0.1×120 + 0.6×80 + 0.3×40 = U$ 72
U$ 10
U$ 62
Facebook Ads
0.2×120 + 0.6×80 + 0.2×40 = U$ 80
U$ 12
U$ 68
Influencer Marketing
0.4×120 + 0.5×80 + 0.1×40 = U$ 92
U$ 18
U$ 74
As you can see in the example above, when we make a detailed analysis taking in consideration the different acquisition channels and the diverse customer segments, we may discover that the most expensive channel is also the most profitable one, because the customers we are acquiring through this channel have a much higher CLTV.
Conclusions
I hope you have enjoyed this discussion about the practical usage of unit metrics such as the CAC and the CLTV, and that my example above has motivated you to try to measure these metrics as accurately as possible. Please feel free to share your personal experience in the comments below.
Thu Nov 26 2020 22:24:57 GMT+0700 (Western Indonesia Time)
Wir haben gerade einen neuen Patch veröffentlicht, der sich auf die Verbesserung der Unterstützung von RAD Studio 10.4.1 für XCode 12, iOS 14 und macOS 11 Big Sur (Intel) konzentriert: Dies sind Betriebssysteme und Tools, die bei der Auslieferung von 10.4.1 noch nicht verfügbar waren.
Insbesondere bietet der Patch Korrekturen für ein Delphi-Ausnahmeproblem auf MacOS 11 Big Sur Intel (das auch PAServer betraf, wenn es auf dieser Plattform lief, d.h. dieser Patch enthält eine neue Version von PAServer), den SDK-Import aus Xcode 12 und das Debuggen von Anwendungen auf einem iOS 14-Gerät.
Beachten Sie, dass neue ARM-basierte Macs, auf denen MacOS 11 Big Sur läuft, MacOS-Anwendungen, die für die Intel-Plattform erstellt wurden, einschließlich solcher, die mit Delphi 10.4.1 erstellt wurden, über die Apple Rosetta 2-Kompatibilitätsschicht ausführen können.
Der Patch kann über GetIt (mit automatischer Installation über ein zeitversetztes Paket, das beim Neustart von RAD Studio angewendet wird) oder über einen direkten Download von my.embarcadero.com (in Kürze verfügbar) und manuelle Installation installiert werden. In beiden Fällen müssen Sie das Installationsprogramm von PAServer for macOS auf Ihren Mac kopieren und manuell installieren. Die Readme-Datei enthält zusätzliche Informationen und Details.
Thu Nov 26 2020 22:24:51 GMT+0700 (Western Indonesia Time)
Acabamos de lanzar un nuevo parche centrado en mejorar el soporte de RAD Studio 10.4.1 para XCode 12, iOS 14 y macOS 11 Big Sur (Intel): estos son sistemas operativos y herramientas que no estaban disponibles cuando se envió 10.4.1.
Específicamente, el parche ofrece soluciones para un problema de excepción de Delphi en macOS 11 Big Sur Intel (que también afectaba a PAServer cuando se ejecutaba en esa plataforma, lo que significa que este parche incluye una nueva versión de PAServer), importación de SDK desde Xcode 12 y aplicaciones de depuración en un dispositivo iOS 14.
Tenga en cuenta que las nuevas Mac basadas en ARM que ejecutan macOS 11 Big Sur pueden ejecutar aplicaciones macOS creadas para la plataforma Intel, incluidas las creadas con Delphi 10.4.1, a través de la capa de compatibilidad Apple Rosetta 2.
El parche se puede instalar a través de GetIt (con instalación automática a través de un paquete diferido, que se aplica al reiniciar RAD Studio) o una descarga directa desde my.embarcadero.com (disponible en breve) e instalación manual. En ambos casos, tendrá que copiar el instalador de PAServer para macOS en su Mac e instalarlo manualmente. El archivo Léame incluye información y detalles adicionales.
Thu Nov 26 2020 22:24:30 GMT+0700 (Western Indonesia Time)
Acabamos de lançar um novo patch focado em melhorar o suporte RAD Studio 10.4.1 para XCode 12, iOS 14 e macOS 11 Big Sur (Intel): esses são sistemas operacionais e ferramentas que não estavam disponíveis quando o 10.4.1 foi lançado.
Especificamente, o patch oferece correções para um problema de exceção Delphi no macOS 11 Big Sur Intel (que também afetava o PAServer ao ser executado nessa plataforma, o que significa que este patch inclui uma nova versão do PAServer), importação do SDK do Xcode 12 e depuração de aplicativos no um dispositivo iOS 14.
Observe que os novos Macs baseados em ARM executando macOS 11 Big Sur podem executar aplicativos macOS desenvolvidos para a plataforma Intel, incluindo aqueles criados com Delphi 10.4.1, por meio da camada de compatibilidade Apple Rosetta 2.
O patch pode ser instalado via GetIt (com instalação automática por meio de um pacote adiado, aplicado quando você reinicia o RAD Studio) ou um download direto de my.embarcadero.com (disponível em breve) e instalação manual. Em ambos os casos, você terá que copiar o instalador do PAServer for macOS para o seu Mac e instalá-lo manualmente. O arquivo leia-me inclui informações e detalhes adicionais.
Thu Nov 26 2020 22:24:20 GMT+0700 (Western Indonesia Time)
Мы только что выпустили новый патч, направленный на улучшение поддержки RAD Studio 10.4.1 для XCode 12, iOS 14 и macOS 11 Big Sur (Intel): это операционные системы и инструменты, которые не были доступны при поставке 10.4.1.
В частности, патч предлагает исправления для проблемы исключения Delphi в macOS 11 Big Sur Intel (которая также влияла на PAServer при работе на этой платформе, что означает, что этот патч включает новую версию PAServer), импорт SDK из Xcode 12 и отладку приложений на устройство iOS 14.
Обратите внимание, что новые компьютеры Mac на базе ARM, работающие под управлением macOS 11 Big Sur, могут запускать приложения macOS, созданные для платформы Intel, в том числе созданные с помощью Delphi 10.4.1, через уровень совместимости Apple Rosetta 2.
Патч можно установить с помощью GetIt (с автоматической установкой через отложенный пакет, который применяется при перезапуске RAD Studio) или путем прямой загрузки с my.embarcadero.com (скоро будет доступен) и ручной установки. В обоих случаях вам придется скопировать установщик PAServer для macOS на свой Mac и установить его вручную. Файл readme содержит дополнительную информацию и подробности.
RAD Studio 10.4 Sydneyでは、「TEdgeBrowser」という新しいWebブラウザコンポーネントが追加されました。TEdgeBrowserコンポーネントは、従来のTWebBrowserに代わるWebブラウザコントロールで、Microsoft Edge ChromiumベースのWebView2コントロールをラップしています。TEdgeBrowserの使用方法について、こちらを参照ください。
現時点では、TEdgeBrowser、WebView for FireMonkeyどちらもWindows専用となりますが、VCLではなく、FireMonkeyでWindows向けのアプリケーションの構築も考えており、既存のTWebBrowser(IEベースのコントロール)からの置き換えを検討されている場合は、WebView for FireMonkeyはとても有用な選択肢の一つとなります。もし興味がありましたら、是非WebView for FireMonkeyをお試しください!
WebView for FireMonkeyライブラリは、WinSoft社の製品です。この記事に記載された機能を利用するには、WinSoft社のサイトからこのライブラリを購入する必要があります。このライブラリに関するサポートは、WinSoft社によって提供されます。
Thu Nov 26 2020 00:13:26 GMT+0700 (Western Indonesia Time)
Inno Setup — это бесплатный установщик для Windows, быстрый, бесплатный и встроенный в Delphi. Представленная в 1997 году игра Inno Setup представлена Джорданом Расселом и Мартейн Лааном. Полный исходный код доступен на GitHub, но авторские права на программное обеспечение сохраняются за авторами. Inno Setup используется во всем мире огромным количеством разработчиков программного обеспечения и компаний, включая такие крупные компании, как Microsoft, для их Visual Studio Code IDE для Windows. Существует ряд сторонних надстроек для Inno Setup, которые действительно выводят его на новый уровень, например, Inno Script Studio от Kymoto Solutions и установщики в стиле VCL от Rodrigo Ruz. Встроенное приложение Inno Setup Compiler поддерживает светлый и темный режимы. Стороннее сопутствующее решение Inno Script Studio имеет мастер установки сценариев, который упрощает создание установочного файла для Inno Setup со всеми необходимыми профессиональными функциями.
Thu Nov 26 2020 00:13:07 GMT+0700 (Western Indonesia Time)
Inno Setup é um instalador gratuito para Windows rápido, gratuito e integrado em Delphi. Introduzido em 1997, o Inno Setup foi criado por Jordan Russell e Martijn Laan. O código-fonte completo está disponível no GitHub, mas os direitos autorais do software são mantidos pelos autores. O Inno Setup é usado em todo o mundo por um grande número de desenvolvedores de software e empresas, incluindo potências como a Microsoft para seu Visual Studio Code IDE no Windows. Existem vários add-ons de terceiros para o Inno Setup que realmente o levam para o próximo nível, como o Inno Script Studio da Kymoto Solutions e os instaladores no estilo VCL de Rodrigo Ruz. O aplicativo Inno Setup Compiler integrado suporta um modo claro e escuro. A solução complementar do Inno Script Studio possui um assistente de script de instalação que torna muito simples criar um arquivo de instalação para o Inno Setup com todos os recursos profissionais de que você precisa.
Thu Nov 26 2020 00:12:04 GMT+0700 (Western Indonesia Time)
Inno Setup es un instalador gratuito para Windows que es rápido, gratuito y está integrado en Delphi. Introducido en 1997, Inno Setup es presentado por Jordan Russell y Martijn Laan. El código fuente completo está disponible en GitHub, pero los autores mantienen los derechos de autor del software. Inno Setup es utilizado en todo el mundo por una gran cantidad de desarrolladores de software y empresas, incluidas potencias como Microsoft para su IDE de código de Visual Studio en Windows. Hay una serie de complementos de terceros para Inno Setup que realmente lo llevan al siguiente nivel, como Inno Script Studio de Kymoto Solutions e instaladores de estilo VCL de Rodrigo Ruz. La aplicación integrada Inno Setup Compiler admite un modo claro y oscuro. La solución complementaria de Inno Script Studio tiene un asistente de instalación de scripts que hace que sea muy sencillo crear un archivo de instalación para Inno Setup con todas las funciones profesionales que necesita.
Thu Nov 26 2020 00:11:40 GMT+0700 (Western Indonesia Time)
Inno Setup ist ein kostenloses Installationsprogramm für Windows, das schnell, kostenlos und in Delphi integriert ist. Inno Setup wurde 1997 eingeführt und wird Ihnen von Jordan Russell und Martijn Laan zur Verfügung gestellt. Der vollständige Quellcode ist auf GitHub verfügbar, aber das Copyright der Software liegt bei den Autoren. Inno Setup wird weltweit von einer großen Anzahl von Softwareentwicklern und Firmen verwendet, darunter auch so mächtige Firmen wie Microsoft für ihre Visual Studio Code IDE auf Windows. Es gibt eine Reihe von Add-ons von Drittanbietern für Inno Setup, die es wirklich auf die nächste Stufe bringen, wie Inno Script Studio von Kymoto Solutions und Installationsprogramme im VCL-Stil von Rodrigo Ruz. Die eingebaute Inno Setup Compiler-Anwendung unterstützt einen hellen und einen dunklen Modus. Die Inno Script Studio-Begleitlösung von Drittanbietern verfügt über einen Installationsskript-Assistenten, mit dem Sie ganz einfach eine Installationsdatei für Inno Setup mit allen professionellen Funktionen erstellen können, die Sie benötigen.
Wed Nov 25 2020 22:00:32 GMT+0700 (Western Indonesia Time)
FinalBuilder ist ein Tool zur Build-Automatisierung, das von Tausenden von Entwicklern zur Vereinfachung ihres Build-Prozesses verwendet wird und in Delphi erstellt wird. Einige der FinalBuilder Funktionen umfassen integriertes Debugging, E-Mail-, MSN-, FTP- & SFTP-Unterstützung, Integration der Versionskontrolle, detaillierte Protokollierung, Variablen, Skripting-Unterstützung und ein Aktionsstudio zum Schreiben benutzerdefinierter FinalBuilder Aktionen. Build-Skripte können mit dem Windows-Scheduler geplant oder je nach FinalBuilder Website in Continua CI, Jenkins oder einen anderen CI Server integriert werden. FinalBuilder zählt Unternehmen wie Intel, Samsung, Symantec, Cisco und HP zu seinen Kunden. Dieses Produkt verfügt über eine riesige Anzahl von Funktionen und eine Funktionsmatrix, in der alle diese Funktionen aufgeführt sind.
Wed Nov 25 2020 22:00:16 GMT+0700 (Western Indonesia Time)
FinalBuilder es una herramienta de automatización de compilación utilizada por miles de desarrolladores para simplificar su proceso de compilación y está integrada en Delphi. Algunas de las características de FinalBuilder incluyen depuración integrada, correo electrónico, MSN, compatibilidad con FTP y SFTP, integración de control de versiones, registro detallado, variables, compatibilidad con secuencias de comandos y un estudio de acción para escribir acciones personalizadas de FinalBuilder. Los scripts de construcción se pueden programar con el programador de Windows o integrarlos con Continua CI, Jenkins o cualquier otro servidor CI según el sitio de FinalBuilder. FinalBuilder enumera empresas como Intel, Samsung, Symantec, Cisco y HP entre sus clientes. Hay una gran cantidad de funciones con este producto y tienen una matriz de funciones que lo describe todo.
Wed Nov 25 2020 21:59:33 GMT+0700 (Western Indonesia Time)
FinalBuilder é uma ferramenta de automação de construção usada por milhares de desenvolvedores para simplificar seu processo de construção e é construída em Delphi. Alguns dos recursos do FinalBuilder incluem depuração integrada, e-mail, suporte para MSN, FTP e SFTP, integração de controle de versão, registro detalhado, variáveis, suporte de script e um estúdio de ação para escrever ações personalizadas do FinalBuilder. Os scripts de construção podem ser agendados com o Windows Scheduler, ou integrá-los com Continua CI, Jenkins ou qualquer outro CI Server de acordo com o site FinalBuilder. FinalBuilder lista empresas como Intel, Samsung, Symantec, Cisco e HP entre seus clientes. Há uma quantidade enorme de recursos com este produto e eles têm uma matriz de recursos que descreve tudo.
Wed Nov 25 2020 21:59:10 GMT+0700 (Western Indonesia Time)
FinalBuilder — это инструмент автоматизации сборки, используемый тысячами разработчиков для упрощения процесса сборки, он построен на Delphi. Некоторые из функций FinalBuilder включают интегрированную отладку, электронную почту, поддержку MSN, FTP и SFTP, интеграцию контроля версий, подробное ведение журнала, переменные, поддержку сценариев и студию действий для написания пользовательских действий FinalBuilder. Сценарии сборки могут быть запланированы с помощью планировщика Windows или интегрированы с Continua CI, Jenkins или любым другим сервером CI в соответствии с сайтом FinalBuilder. FinalBuilder перечисляет среди своих клиентов такие компании, как Intel, Samsung, Symantec, Cisco и HP. В этом продукте есть огромное количество функций, и у них есть матрица функций, которая описывает все это.
Tue Nov 24 2020 22:23:26 GMT+0700 (Western Indonesia Time)
David I. hat einen fantastischen Blog-Beitrag über die Verwendung von Python4Delphi mit C++Builder. Dieser wurde von unseren früheren Webinaren zu diesem Thema inspiriert und ist das Ergebnis seiner Zusammenarbeit mit Kiriakos (AKA PyScripter), dem Maintainer von Python4Delphi, der auch einige Änderungen in der Bibliothek vorgenommen hat, um besser mit C++Builder arbeiten zu können.
Auf vielfachen Wunsch haben David und Kiriakos auch vereinbart, ein Webinar für Python für C++-Entwickler zu veranstalten, in dem Sie lernen können, Python von Ihren bevorzugten C++-Entwicklertools aus zu nutzen.
Tue Nov 24 2020 22:23:13 GMT+0700 (Western Indonesia Time)
David I.tiene una publicación de blog fantástica sobre el uso de Python4Delphi con C ++ Builder . Esto se inspiró en nuestros seminarios webanteriores sobre el tema . y es el resultado de su colaboración con Kiriakos (AKA PyScripter), el mantenedor de Python4Delphi , quien también hizo algunos cambios en la biblioteca para trabajar mejor con C ++ Builder.
Por solicitud popular, David y Kiriakos también acordaron ejecutar un seminario web de Python para desarrolladores de C ++ donde puede aprender a aprovechar Python desde sus herramientas de desarrollo de C ++ favoritas.
Tue Nov 24 2020 22:22:45 GMT+0700 (Western Indonesia Time)
David I. tem uma postagem de blog fantástica sobre como usar Python4Delphi com o C ++ Builder . Isso foi inspirado em nossos webinarsanteriores sobre o assunto . e é o resultado de sua colaboração com Kiriakos (também conhecido como PyScripter), o mantenedor do Python4Delphi , que também fez algumas alterações na biblioteca para funcionar melhor com o C ++ Builder.
Por solicitação popular, David e Kiriakos também concordaram em executar um webinar de Python para desenvolvedores C ++, onde você pode aprender a aproveitar o Python de suas ferramentas favoritas de desenvolvedor C ++.
Tue Nov 24 2020 22:22:34 GMT+0700 (Western Indonesia Time)
У Дэвида И. есть фантастическая запись в блоге об использовании Python4Delphi с C ++ Builder . Это было вдохновлено нашими предыдущими вебинарами по этой теме . и является результатом его сотрудничества с Кириакосом (AKA PyScripter), сопровождающим Python4Delphi , который также внес некоторые изменения в библиотеку для улучшения работы с C ++ Builder.
По многочисленным просьбам Дэвид и Кириакос также согласились провести веб-семинар по Python для разработчиков на C ++, на котором вы сможете научиться использовать Python с помощью своих любимых инструментов разработчика C ++.
Tue Nov 24 2020 22:22:16 GMT+0700 (Western Indonesia Time)
Es ist bereits November – die Zeit vergeht wie im Flug. Trotz der globalen Pandemie stürmen wir weiter voran. Da sich Entwickler immer mehr daran gewöhnen, von zu Hause aus zu arbeiten (und manche lieben es), werden immer mehr Projekte aufgenommen, was aufregend ist. Ich bin besonders begeistert, dass es auf GitHub immer mehr öffentliche Delphi-Projekte gibt und die damit verbundenen Diskussionen auf beliebten Plattformen wie Stack Overflow und Reddit zunehmen, wenn auch nicht so schnell. Ich weiß, dass wir unsere eigenen, proprietäreren haben, die großartig sind, aber je mehr Delphi wir dort veröffentlichen, desto besser!
Meine Themen waren in letzter Zeit einfach:
Entwickeln Sie brillanten Code.
Teile es.
Inspirieren Sie bestehende und neue Delphi-Entwickler.
Haben Sie in letzter Zeit eines dieser Kontrollkästchen aktiviert? Es gibt ungefähr 8K Delphi-Projekte auf GitHub . Über 500.000 Entwickler kennen Delphi, und mindestens 200 bis 300.000 entwickeln sich aktiv damit. Du machst die Mathematik!
Wir haben kürzlich Open Source von Bold for Delphi veröffentlicht , um einen Beitrag zur Community zu leisten, und eine fantastische Gruppe von Entwicklern arbeitet derzeit an dem Projekt. Embarcadero fängt gerade erst mit Open Source-Projekten an. Halten Sie also Ausschau nach mehr!
Hier sind einige Höhepunkte unserer aktuellen Bemühungen:
10.4.1 Qualitätsfreigabe macht 10.4 noch besser
10.4 war eine wesentliche Version mit über 1.000 Verbesserungen und Qualitätskorrekturen. Viele seiner Funktionen wurden sowohl von großen Unternehmen als auch von einzelnen Entwicklern begrüßt. 10.4.1 ist eine stabile und robuste Version mit einer schnelleren Implementierung von Delphi Code Insight basierend auf dem Language Server Protocol, VCL-Stilen, die sich hervorragend für High-DPI- und 4K-Monitore eignen, erweiterten Apple-Plattformen und API-Abdeckung. Es enthält auch einen stark verbesserten GetIt-Paketmanager und viele andere Funktionen. 10.4.1 fügt über 800 Qualitätsverbesserungen hinzu, darunter mehr als 500 für Probleme, die auf der Quality Portal-Website öffentlich gemeldet werden. 10.4.2 Beta wird auch bald für Kunden mit Update-Abonnement gestartet. Es ist eine gute Zeit für ein Upgrade!
DelphiCon war unglaublich!
Mit fast 4000 registrierten Personen war dies unsere größte jährliche Delphi-Veranstaltung. Wenn Sie die Live-Sitzungen verpasst haben, registrieren Sie sich jetzt , um die Wiederholungen abzufangen . In diesem Jahr haben wir viele Expertengremien aufgenommen, darunter einige der führenden Architekten von Delphi , ein großer Erfolg für alle! Nehmen Sie an Präsentationen von Vordenkern teil und genießen Sie einige der großartigen Vergünstigungen und Rabatte . Eines unserer Ziele mit DelphiCon war es, das Format im Vergleich zu früheren CodeRage-Ereignissen zu vereinfachen, und wir hoffen, dass es Ihnen gefallen hat. Wir sind immer auf der Suche nach Verbesserungsmöglichkeiten und Ihr Feedback ist wertvoll. Auf vielfachen Wunsch ist für den Frühling ein spezielles C ++ – Event in Arbeit.
Aktualisierte RAD Studio Roadmap
Das Produktmanagement hat kürzlich die RAD Studio-Roadmap für November 2020 aktualisiert . Es ist immer toll zu sehen, was die Pläne für die Zukunft sind, und den Kommentar des Produktmanagements zu diesen Plänen zu lesen . Diese Roadmaps basieren auf der Richtung der Branche und dem Feedback, das wir von Ihnen, unseren Benutzern, erhalten. Überprüfen Sie die Roadmap, hinterlassen Sie Ihr Feedback und reichen Sie Funktionsanfragen im Quality Portal ein .
Wir sind uns bewusst, dass die Budgets heutzutage knapp sind und wir möchten die Arbeit mit den neuesten Versionen wirtschaftlicher gestalten. Wir haben eine Reihe attraktiver globaler Werbeaktionen für unterschiedliche Anforderungen.
Wir haben die Architect-SKU um viele Mehrwertprodukte erweitert, von Ext JS- und Ranorex-Lizenzen bis hin zur erweiterten Verwendung von InterBase und RAD Server. Wenn Sie nach dem besten Dollar-Angebot suchen, ist das eindeutig ein großartiges Angebot.
Wenn Sie Web-Apps mit Delphi erstellen möchten, bieten wir drei großartige Optionen: IntraWeb , TMS Web oder UniGui . Dies sind bewährte Lösungen, die mit RAD Studio hervorragend funktionieren. Sie alle haben Nuancen, die sie für verschiedene Anwendungsfälle gut machen, sind aber jeweils leistungsstark und zuverlässig.
Die Nachfrage nach unseren Upgrade-Preisen ist so hoch wie nie zuvor. Um diese Nachfrage zu befriedigen und bei strengeren Budgetbeschränkungen zu helfen, bieten wir 35% Rabatt für alle Ausgaben. Der Rabatt und das Web Pack sind exklusiv und nicht zusammen erhältlich.
Wir arbeiten sehr eng mit unseren regionalen Partnern zusammen und haben lokale Werbeaktionen maßgeschneidert. Ich empfehle Ihnen daher , mit Wiederverkäufern oder unseren Vertretern des Embarcadero- Kontoszu sprechen, um herauszufinden, was für Sie am besten ist.
KOSTENLOSE Upgrade-Bürozeiten!
Wir bringen kostenlose Upgrade-Beratungen zurück. Für eine begrenzte Zeit können Sie mit unseren Softwareberatern sprechen, um Ihren Upgrade-Plan zu entwickeln. Wie lange wird es dauern? Welche Ressourcen und Tools benötigen Sie? Was ist der Einfluss auf die Architektur? Was ist, wenn Sie einen Webclient oder einen mobilen Client hinzufügen möchten? Gibt es Dritte, die Ihnen helfen? Dies sind alles gültige Fragen, die Sie kostenlos diskutieren können. Klicken Sie auf den Link unten, um Ihren Termin noch heute zu vereinbaren.
Coole kostenlose Debugger-IDE-Erweiterung für Kunden mit Update-Abonnement
Ich freue mich, Getit eine weitere coole Komponente für alle Upgrade-Abonnement-Kunden vorstellen zu können: Parallel Debugger .
Viele Apps fügen heute Multithreading hinzu: Die Zeiten von Single-Threaded-Apps, in denen alles auf dem Haupt-UI-Thread erledigt wird, sind vorbei. Möglicherweise verwenden Sie Threads über TThread oder über die neue Bibliothek für parallele Programmierung , die beide bei unseren Entwicklern sehr beliebt sind. Obwohl Parallelität und Threading immer wichtiger werden, ist die Debugger-Schnittstelle in vielen IDEs – nicht nur in unseren, sondern in allen IDEs – weitgehend auf Single-Threaded-Programmierung ausgerichtet: Zum Beispiel wird immer nur der Aufrufstapel eines Threads angezeigt.
Dieses neue Parnassus Parallel Debugger IDE-Plugin zielt darauf ab, Ihre App umfassend zu verstehen, wenn mehrere Dinge gleichzeitig ausgeführt werden. Sie können alle parallelen Ausführungen untersuchen, alle Threads auf einmal und ihre Interaktionen anzeigen, mit verbessertem Editor-Markup, Verbesserungen beim Ausführen und Steppen eines Prozesses, Verbesserungen bei Haltepunkten und mehr. Wir glauben, dass es Funktionen hinzufügt, die in keiner anderen IDE zu sehen sind. Selbst wenn Sie nicht mehrere Threads verwenden, kann ein Teil der erweiterten Benutzeroberfläche Ihre Debugging-Produktivität oder Ihr Verständnis für die Ausführung Ihrer App erheblich verbessern!
Der Parallel Debugger stammt aus derselben Quelle wie Bookmarks und Navigator, zwei Plugins in GetIt, die eine verbesserte Navigation und andere Funktionen in der IDE hinzufügen. Sie gehören stetig zu den beliebtesten Downloads auf GetIt. Wir hoffen, dass das neue Plugin ähnlich bewertet wird!
Sie können sich bald auf weitere Details zum Parallel Debugger freuen, z. B. eine detaillierte Beschreibung der Funktionen, die Sie beim Debuggen in Delphi und C ++ Builder haben, Screenshots und mehr. Wir können es kaum erwarten, es Ihnen zu zeigen!
Viel schnellere C ++ – Compiler!
Wir hören von unseren Kunden, dass die Geschwindigkeit der C ++ – Kompilierung, insbesondere mit Clang, etwas ist, das wir wirklich beschleunigen sollen. Nun, wir haben etwas Besonderes für Sie: TwineCompile, ein frei verfügbares Plugin in GetIt (kostenlos für alle SKUs, einschließlich Pro!), Das das Kompilieren von C ++ – Codebasen um das bis zu 50-fache beschleunigen kann.
Das ist kein Tippfehler – TwineCompile skaliert nicht nur die Geschwindigkeit mit der Anzahl der verfügbaren Kerne, sondern verfügt auch über einige beeindruckende Techniken, um andere Optimierungen vorzunehmen. Es kann die Zeit, die zum Erstellen einer C ++ – App benötigt wird, drastisch reduzieren. Wir lieben es und empfehlen es wirklich. Es ist heute in GetIt kostenlos verfügbar, auch für Profis (nicht nur für Unternehmen und Architekten).
Kyle Wheeler und David Millington arbeiten an einem C ++ Builder-spezifischen Update, in dem sie einige Neuigkeiten zu neuen Bibliotheken und anderen C ++ – spezifischen Updates veröffentlichen. Bleib dran!
Delphi und Python arbeiten zusammen
Das ist besonders aufregend für mich, weil es ein weiteres Community-Projekt ist. Der Entwickler von PyScripter hat eine Reihe großartiger Integrationen zwischen Delphi und Python aus RAD Studio erstellt. Diese wurden in den letzten Monaten in zwei Webinaren mit über 4.000 Teilnehmern vorgestellt. Es ist eine großartige Gelegenheit, die Tools für Delphi-Entwickler zu erweitern und Python-Entwicklern RAD Studio vorzustellen. Die Python-Entwickler-Community wächst sehr schnell und für viele ist dies ihre erste Computersprache (wahrscheinlich hätte es Delphi sein sollen). RAD Studio ist ein natürliches und einfaches Tool für diese Entwickler, um leistungsstarke native Apps zu erstellen.
Tue Nov 24 2020 22:22:00 GMT+0700 (Western Indonesia Time)
Ya es noviembre, el tiempo vuela estos días. A pesar de la pandemia mundial, seguimos avanzando. A medida que los desarrolladores se están acostumbrando a trabajar desde casa (y a algunos les encanta), vemos más proyectos retomando, lo cual es emocionante. Estoy especialmente emocionado de que haya cada vez más proyectos públicos de Delphi en GitHub, y las discusiones relacionadas en plataformas populares, como Stack Overflow y Reddit, estén creciendo, aunque no tan rápido. Sé que tenemos nuestros propios más propietarios, que son geniales, pero cuanto más Delphi publiquemos, ¡mejor!
Mis temas últimamente han sido simples:
Desarrolle un código brillante.
Compártelo .
Inspire a los desarrolladores de Delphi nuevos y existentes.
¿Ha marcado alguna de estas casillas últimamente? Hay alrededor de 8K proyectos Delphi en GitHub . Más de 500.000 desarrolladores conocen Delphi, y al menos 200-300K están desarrollando activamente con él. ¡Haz las matemáticas!
Recientemente lanzamos Bold for Delphi open source para ayudar a contribuir a la comunidad, y un grupo fantástico de desarrolladores ahora está trabajando en el proyecto. Embarcadero recién está comenzando con proyectos de código abierto, ¡así que esté atento a más!
Estos son algunos aspectos destacados de nuestros esfuerzos actuales:
10.4.1 El lanzamiento de calidad hace que 10.4 sea aún mejor
10.4 fue una versión esencial con más de 1,000 mejoras y correcciones de calidad. Muchas de sus características fueron bien recibidas tanto por grandes empresas como por desarrolladores individuales. 10.4.1 es una versión estable y robusta , que presenta una implementación más rápida de Delphi Code Insight basada en el protocolo de servidor de idiomas, estilos VCL que funcionan muy bien con monitores High-DPI y 4K, plataformas Apple extendidas y cobertura API. También incluye un administrador de paquetes GetIt muy mejorado y muchas otras características. 10.4.1 agrega más de 800 mejoras de calidad, incluidas más de 500 para problemas informados públicamente en el sitio Quality Portal. 10.4.2 Beta también comenzará pronto para los clientes de suscripción de actualización. ¡Es un buen momento para actualizar!
¡DelphiCon fue increíble!
Con casi 4000 personas registradas, este fue nuestro mayor evento anual de Delphi. Si se perdió las sesiones en vivo, regístrese ahora para ver las repeticiones . Este año incluimos muchos paneles de expertos, incluidos algunos de los arquitectos principalesde Delphi , ¡un gran éxito para todos! Únase y disfrute de las presentaciones de líderes de opinión y vea algunos de los grandes beneficios y descuentos disponibles . Uno de nuestros objetivos con DelphiCon era simplificar el formato en comparación con eventos anteriores de CodeRage y esperamos que lo haya disfrutado. Siempre estamos buscando formas de mejorar y sus comentarios son valiosos. Por demanda popular, se está preparando un evento dedicado de C ++ para la primavera.
Hoja de ruta de RAD Studio actualizada
La gestión de productos actualizó recientemente la hoja de ruta de RAD Studio para noviembre de 2020 . Siempre es bueno ver cuáles son los planes para el futuro y leer los comentarios de la gestión de productos sobre estos planes. Estas hojas de ruta se basan en la dirección de la industria y los comentarios que recibimos de ustedes, nuestros usuarios. Consulte la hoja de ruta, deje sus comentarios y presente solicitudes de funciones en Quality Portal .
Sabemos que los presupuestos son ajustados en estos días y queremos que trabajar con las últimas versiones sea más económico. Tenemos una serie de atractivas promociones globales para satisfacer diferentes necesidades.
Hemos mejorado el SKU de Architect para incluir una gran cantidad de productos de valor agregado, desde licencias Ext JS y Ranorex hasta el uso ampliado de InterBase y RAD Server. Si está buscando la mejor oferta en dólares, esa es claramente una excelente.
Si desea crear aplicaciones web con Delphi, ofrecemos tres excelentes opciones: IntraWeb , TMS Web o UniGui . Estas son soluciones comprobadas que funcionan muy bien con RAD Studio. Todos tienen matices que los hacen buenos para diferentes casos de uso, pero cada uno es poderoso y confiable.
La demanda de nuestros precios de actualización está en su punto más alto. Para satisfacer esta demanda y ayudar con las restricciones presupuestarias más estrictas, ofrecemos un 35% de descuento en todas las ediciones. El descuento y el Web Pack son exclusivos no están disponibles juntos.
Colaboramos muy de cerca con nuestros socios regionales y hemos adaptado promociones locales , por lo que le animo a hablar con los revendedores o con nuestros representantes de cuentas de Embarcaderopara ver qué es lo mejor para usted.
¡Actualice GRATIS el horario de oficina!
Estamos recuperando consultas de actualización gratuitas. Por tiempo limitado, puede hablar con nuestros consultores de software para desarrollar su plan de actualización. ¿Cuánto tiempo tardará? ¿Qué recursos y herramientas necesitas utilizar? ¿Cuál es el impacto en la arquitectura? ¿Qué sucede si desea agregar un cliente web o un cliente móvil? ¿Hay terceros disponibles para ayudarlo? Todas estas son preguntas válidas que puede discutir sin costo alguno. Haga clic en el enlace a continuación para programar su cita hoy.
Cool Free Debugger IDE Expansión para clientes con suscripción de actualización
Estoy emocionado de presentar otro componente interesante que llegará muy pronto a Getit para todos los clientes de Suscripciones de actualización: Parallel Debugger .
Hoy en día, muchas aplicaciones agregan subprocesos múltiples: los días de las aplicaciones de un solo subproceso donde todo se hace en el subproceso principal de la interfaz de usuario han terminado. Es posible que esté utilizando subprocesos a través de TThread , o mediante la nueva biblioteca de programación paralela , los cuales son muy populares entre nuestros desarrolladores. Sin embargo, a pesar de que el paralelismo y el subproceso son cada vez más importantes, la interfaz del depurador en muchos IDE, no solo el nuestro, sino todos los IDE, todavía está orientada en gran medida a la programación de un solo subproceso: por ejemplo, ver solo la pila de llamadas de un subproceso a la vez.
Este nuevo plugin Parnassus Parallel Debugger IDE está dirigido directamente a comprender su aplicación de manera integral cuando está haciendo varias cosas a la vez. Puede examinar toda la ejecución paralela, ver todos los hilos a la vez y sus interacciones, con el marcado mejorado del editor, mejoras en la ejecución y paso de un proceso, mejoras en los puntos de interrupción y más. Creemos que agrega características que no se ven en ningún otro IDE. Incluso si no utiliza varios subprocesos, algunas de las interfaces de usuario mejoradas pueden mejorar su productividad de depuración o la comprensión de la ejecución de su aplicación.
Parallel Debugger proviene de la misma fuente que Bookmarks y Navigator, dos complementos en GetIt que agregan navegación mejorada y otras características dentro del IDE. Se encuentran constantemente entre las descargas más populares de GetIt. ¡Esperamos que el nuevo complemento sea valorado de manera similar!
Puede esperar más detalles sobre el depurador paralelo pronto, como una descripción detallada de las funciones que tendrá al depurar en Delphi y C ++ Builder, capturas de pantalla y más. ¡No podemos esperar para mostrarte!
¡Compiladores de C ++ mucho más rápidos!
Escuchamos a nuestros clientes que la velocidad de la compilación de C ++, especialmente con Clang, es algo que realmente le gustaría que aceleramos. Bueno, tenemos algo especial para usted: TwineCompile, un complemento disponible gratuitamente en GetIt (¡que es gratis para todos los SKU, incluido Pro!) Que puede acelerar la compilación de bases de código C ++ hasta 50 veces.
Eso no es un error tipográfico, además de escalar la aceleración con la cantidad de núcleos disponibles, TwineCompile tiene algunas técnicas impresionantes para realizar otras optimizaciones. Realmente puede reducir drásticamente el tiempo que lleva crear una aplicación C ++. Nos encanta y realmente lo recomendamos. Está disponible en GetIt hoy, también para profesionales (no solo para empresas y arquitectos), de forma gratuita.
Kyle Wheeler y David Millington están trabajando en una actualización específica de C ++ Builder donde compartirán algunas noticias sobre nuevas bibliotecas y otras actualizaciones específicas de C ++. ¡Estén atentos para eso!
Delphi y Python trabajando juntos
Esto es particularmente emocionante para mí porque es otro proyecto impulsado por la comunidad. El creador de PyScripter creó una serie de integraciones increíbles entre Delphi y Python de RAD Studio. Estos se presentaron en dos seminarios web en los últimos meses con más de 4.000 participantes. Es una gran oportunidad para expandir las herramientas disponibles para los desarrolladores de Delphi y presentar a los desarrolladores de Python RAD Studio. La comunidad de desarrolladores de Python está creciendo muy rápido y, para muchos, este es su primer lenguaje informático (probablemente debería haber sido Delphi). RAD Studio es una herramienta fácil y natural para que estos desarrolladores creen poderosas aplicaciones nativas.
Tue Nov 24 2020 22:21:36 GMT+0700 (Western Indonesia Time)
Já é novembro – o tempo voa atualmente. Apesar da pandemia global, continuamos avançando. Conforme os desenvolvedores estão se acostumando a trabalhar em casa (e alguns adoram), vemos mais projetos crescendo, o que é empolgante. Estou especialmente entusiasmado com o fato de haver cada vez mais projetos Delphi públicos no GitHub, e as discussões relacionadas em plataformas populares, como Stack Overflow e Reddit, estão crescendo, embora não tão rapidamente. Eu sei que temos os nossos próprios mais proprietários, que são ótimos, mas quanto mais Delphi colocarmos lá, melhor!
Meus temas ultimamente têm sido simples:
Desenvolva código brilhante.
Compartilhe .
Inspire desenvolvedores Delphi novos e existentes.
Você verificou alguma dessas caixas recentemente? Existem cerca de 8 mil projetos Delphi no GitHub . Mais de 500 mil desenvolvedores conhecem Delphi, e pelo menos 200 a 300 mil estão desenvolvendo ativamente com ele. Você faz a matemática!
Recentemente, lançamos o código aberto Bold for Delphi para ajudar a contribuir com a comunidade, e um grupo fantástico de desenvolvedores está trabalhando agora no projeto. Embarcadero está apenas começando com projetos de código aberto, então fique atento para mais!
Aqui estão alguns destaques de nossos esforços atuais:
10.4.1 A liberação de qualidade torna a 10.4 ainda melhor
10.4 foi uma versão essencial com mais de 1.000 melhorias e correções de qualidade. Muitos de seus recursos foram bem recebidos por grandes empresas e desenvolvedores individuais. 10.4.1 é uma versão estável e robusta , apresentando uma implementação mais rápida do Delphi Code Insight baseado em Language Server Protocol, estilos VCL que funcionam bem com monitores High-DPI e 4K, plataformas Apple estendidas e cobertura de API. Também inclui um gerenciador de pacotes GetIt muito aprimorado e muitos outros recursos. 10.4.1 adiciona mais de 800 melhorias de qualidade, incluindo mais de 500 para problemas relatados publicamente no site do Portal da Qualidade. 10.4.2 Beta também será lançado em breve para clientes de Assinatura de Atualização. É um ótimo momento para atualizar!
DelphiCon foi incrível!
Com quase 4000 pessoas inscritas, este foi o nosso maior evento Delphi anual. Se você perdeu as sessões ao vivo, registre-se agora para assistir aos replays . Este ano incluímos muitos painéis de especialistas, incluindo alguns dos principais arquitetosda Delphi , um grande sucesso para todos! Participe e aproveite as apresentações de líderes de pensamento e confira algumas das grandes vantagens e descontos disponíveis . Um de nossos objetivos com o DelphiCon era simplificar o formato em comparação aos eventos anteriores do CodeRage e esperamos que você tenha gostado. Estamos sempre procurando maneiras de melhorar, e seu feedback é valioso. Por demanda popular, um evento C ++ dedicado está em andamento para a primavera.
RAD Studio RAD atualizado
O gerenciamento de produtos atualizou recentemente o roteiro do RAD Studio para novembro de 2020 . É sempre bom ver quais são os planos para o futuro e ler os comentários do gerenciamento de produtos sobre esses planos. Esses roteiros são baseados na direção da indústria e no feedback que recebemos de vocês, nossos usuários. Confira o roteiro, deixe seu feedback e registre as solicitações de recursos no Portal da Qualidade .
Percebemos que os orçamentos estão apertados atualmente e queremos tornar o trabalho com os últimos lançamentos mais econômico. Temos uma série de promoções globais atraentes para atender às diferentes necessidades.
Aprimoramos o Architect SKU para incluir muitos produtos de valor agregado, desde licenças Ext JS e Ranorex até o uso expandido de InterBase e RAD Server. Se você está procurando o melhor negócio em dinheiro, este é claramente um ótimo negócio.
Se você deseja construir aplicativos da web com Delphi, oferecemos três ótimas opções: IntraWeb , TMS Web ou UniGui . Estas são soluções comprovadas que funcionam muito bem com RAD Studio. Todos eles têm nuances que os tornam adequados para diferentes casos de uso, mas são poderosos e confiáveis.
A demanda por nossos preços de atualização está em alta. Para atender a essa demanda e ajudar com restrições de orçamento mais rígidas, estamos oferecendo 35% de desconto em todas as edições. O desconto e o Web Pack são exclusivos e não estão disponíveis juntos.
Colaboramos muito de perto com nossos parceiros regionais e personalizamos as promoções locais , por isso encorajo você a falar com os revendedores ou nossos representantes de conta da Embarcaderopara ver o que é melhor para você.
Horário comercial de atualização GRATUITO!
Estamos trazendo de volta consultas de atualização gratuitas. Por um tempo limitado, você pode falar com nossos consultores de software para desenvolver seu plano de atualização. Quanto tempo vai demorar? Quais recursos e ferramentas você precisa usar? Qual é o impacto na arquitetura? E se você quiser adicionar um cliente web ou um cliente móvel? Existem terceiros disponíveis para ajudá-lo? Todas essas são questões válidas que você pode discutir gratuitamente. Clique no link abaixo para agendar sua consulta hoje.
Cool Free Debugger IDE Expansion para atualizar clientes de assinatura
Estou animado para apresentar outro componente interessante em breve no Getit para todos os clientes de Assinatura de Atualização: Depurador Paralelo .
Muitos aplicativos hoje adicionam multithreading: os dias dos aplicativos single-threaded, em que tudo é feito no thread de IU principal, acabaram. Você pode estar usando threads por meio de TThread ou da nova Biblioteca de Programação Paralela , ambas muito populares entre nossos desenvolvedores. No entanto, apesar do paralelismo e do encadeamento serem cada vez mais importantes, a interface do depurador em muitos IDEs – não apenas no nosso, mas em todos os IDEs – ainda é amplamente orientada para a programação de encadeamento único: por exemplo, vendo apenas uma pilha de chamadas do encadeamento por vez.
Este novo plug-in Parnassus Parallel Debugger IDE tem como objetivo principal compreender seu aplicativo de forma abrangente quando ele está fazendo várias coisas ao mesmo tempo. Você pode examinar todas as execuções paralelas, ver todos os threads de uma vez e suas interações, com marcação de editor aprimorada, melhorias na execução e na etapa de um processo, melhorias nos pontos de interrupção e muito mais. Acreditamos que adiciona recursos não vistos em qualquer outro IDE. Mesmo se você não usar vários threads, algumas das interfaces de usuário aprimoradas podem realmente melhorar sua produtividade de depuração ou compreensão da execução de seu aplicativo!
O Parallel Debugger vem da mesma fonte que Bookmarks e Navigator, dois plug-ins no GetIt que adicionam navegação aprimorada e outros recursos dentro do IDE. Eles estão constantemente entre os downloads mais populares no GetIt. Esperamos que o novo plugin seja avaliado da mesma forma!
Você pode esperar mais detalhes sobre o Depurador Paralelo em breve, como uma descrição detalhada dos recursos que você terá ao depurar no Delphi e C ++ Builder, capturas de tela e muito mais. Mal podemos esperar para te mostrar!
Compiladores C ++ muito mais rápidos!
Ouvimos de nossos clientes que a velocidade da compilação C ++, especialmente com Clang, é algo que você realmente gostaria que acelerássemos. Bem, nós temos algo especial para você: TwineCompile, um plugin disponível gratuitamente no GetIt (que é gratuito para todos os SKUs, incluindo o Pro!) Que pode acelerar a compilação de bases de código C ++ em até 50x.
Isso não é um erro de digitação – além de escalar a aceleração com o número de núcleos disponíveis, TwineCompile tem algumas técnicas impressionantes para fazer outras otimizações. Ele realmente pode reduzir drasticamente o tempo que leva para construir um aplicativo C ++. Nós amamos e realmente recomendamos. Ele está disponível no GetIt hoje, também para profissionais (não apenas Enterprise e Architect), gratuitamente.
Kyle Wheeler e David Millington estão trabalhando em uma atualização específica do C ++ Builder, onde compartilharão algumas novidades sobre novas bibliotecas e outras atualizações específicas do C ++. Fique ligado nisso!
Delphi e Python trabalhando juntos
Isso é particularmente emocionante para mim porque é outro projeto voltado para a comunidade. O criador do PyScripter construiu uma série de integrações incríveis entre Delphi e Python a partir do RAD Studio. Eles foram apresentados em dois webinars nos últimos meses, com mais de 4.000 participantes. É uma grande oportunidade de expandir as ferramentas disponíveis para desenvolvedores Delphi e apresentar os desenvolvedores Python ao RAD Studio. A comunidade de desenvolvedores Python está crescendo muito rápido e, para muitos, esta é a primeira linguagem de computador (provavelmente deveria ser Delphi). O RAD Studio é uma ferramenta natural e fácil para esses desenvolvedores criarem aplicativos nativos poderosos.
Tue Nov 24 2020 22:21:14 GMT+0700 (Western Indonesia Time)
Уже ноябрь — в эти дни время летит незаметно. Несмотря на глобальную пандемию, мы продолжаем идти вперед. По мере того, как разработчики все больше привыкают к работе из дома (а некоторым это нравится), мы видим, как набирает обороты больше проектов, что очень интересно. Я особенно рад, что на GitHub появляется все больше и больше общедоступных проектов Delphi, и связанные с ними обсуждения на популярных платформах, таких как Stack Overflow и Reddit, растут, хотя и не так быстро. Я знаю, что у нас есть собственные, более проприетарные, и это здорово, но чем больше Delphi мы добавим, тем лучше!
В последнее время мои темы были простыми:
Разработайте блестящий код.
Поделись этим.
Вдохновляйте существующих и новых разработчиков Delphi.
Ставили ли вы какие-нибудь из этих флажков в последнее время? На GitHubесть около 8K проектов Delphi . Около 500К + разработчиков знают Delphi, и по крайней мере 200-300К активно развиваются с его помощью. Вы делаете математику!
Недавно мы выпустили Bold для Delphi с открытым исходным кодом, чтобы помочь сообществу, и сейчас над проектом работает фантастическая группа разработчиков. Embarcadero только начинает работать с проектами с открытым исходным кодом, так что ждите большего!
Вот некоторые основные моменты наших текущих усилий:
10.4.1 Качество делает 10.4 еще лучше
10.4 был важным выпуском с более чем 1000 улучшений и исправлений качества. Многие из его функций были одобрены как крупными компаниями, так и отдельными разработчиками. 10.4.1 — это стабильная и надежная версия , отличающаяся более быстрой реализацией Delphi Code Insight на основе протокола языкового сервера, стилей VCL, которые отлично работают с мониторами с высоким разрешением и разрешением 4K, расширенными платформами Apple и покрытием API. Он также включает значительно улучшенный менеджер пакетов GetIt и многие другие функции. В 10.4.1 добавлено более 800 улучшений качества, в том числе более 500 для проблем, о которых публично сообщается на сайте Quality Portal. 10.4.2 Бета-версия также скоро стартует для пользователей подписки на обновления. Прекрасное время для обновления!
DelphiCon был потрясающим!
Это было самое большое ежегодное мероприятие Delphi, на которое было зарегистрировано почти 4000 человек. Если вы пропустили прямые трансляции, зарегистрируйтесь сейчас, чтобы смотреть повторы . В этом году мы включили множество экспертных групп, в том числе с участием некоторых ведущих архитекторов Delphi, что произвело на всех огромное впечатление! Присоединяйтесь и наслаждайтесь презентациями от лидеров мнений и ознакомьтесь с некоторыми из доступных льгот и скидок . Одной из наших целей с DelphiCon было упростить формат по сравнению с предыдущими мероприятиями CodeRage, и мы надеемся, что вам понравилось. Мы всегда ищем способы улучшить нашу работу, и ваши отзывы очень ценны. По многочисленным просьбам весной планируется провести специальное мероприятие по C ++.
Обновленная дорожная карта RAD Studio
Руководство продукта недавно обновило дорожную карту RAD Studio на ноябрь 2020 года . Всегда приятно видеть, каковы планы на будущее, и читать комментарии руководства продукта к этим планам. Эти дорожные карты основаны на направлениях развития отрасли и на отзывах, которые мы получаем от вас, наших пользователей. Ознакомьтесь с дорожной картой, оставьте свои отзывы и отправьте запросы на добавление функций на портале качества .
Мы понимаем, что в наши дни бюджеты ограничены, и хотим сделать работу с последними версиями более экономичной. У нас есть ряд привлекательных глобальных рекламных акций для удовлетворения различных потребностей.
Мы улучшили артикул Architect, включив в него множество продуктов с добавленной стоимостью, от лицензий Ext JS и Ranorex до расширенного использования InterBase и RAD Server. Если вы ищете лучшую сделку в долларах, это, безусловно, отличный вариант.
Если вы хотите создавать веб-приложения с помощью Delphi, мы предлагаем три отличных варианта: IntraWeb , TMS Web или UniGui . Это проверенные решения, которые отлично работают с RAD Studio. У всех них есть нюансы, которые делают их удобными для разных сценариев использования, но каждый из них мощный и надежный.
Спрос на наши цены на Обновление находится на рекордно высоком уровне. Чтобы удовлетворить этот спрос и помочь с более жесткими ограничениями бюджета, мы предлагаем скидку 35% на все версии. Скидка и веб-пакет являются эксклюзивными и не доступны вместе.
Мы очень тесно сотрудничаем с нашими региональными партнерами и разрабатываем местные рекламные акции , поэтому я рекомендую вам поговорить с торговыми посредниками или представителями нашей учетной записи Embarcadero,чтобы узнать, что лучше для вас.
БЕСПЛАТНЫЕ часы работы апгрейда!
Мы возвращаем бесплатные консультации по обновлению. В течение ограниченного времени вы можете поговорить с нашими консультантами по программному обеспечению, чтобы разработать план обновления. Как много времени это займет? Какие ресурсы и инструменты вам нужно использовать? Какое влияние на архитектуру? Что делать, если вы хотите добавить веб-клиент или мобильный клиент? Могут ли вам помочь третьи стороны? Это все важные вопросы, которые вы можете обсудить бесплатно. Щелкните ссылку ниже, чтобы назначить встречу сегодня.
Классное бесплатное расширение IDE отладчика для клиентов по подписке на обновления
Я рад представить еще один интересный компонент, который очень скоро появится в Getit для всех пользователей подписки на обновление: Parallel Debugger .
Многие приложения сегодня добавляют многопоточность: времена однопоточных приложений, когда все делалось в основном потоке пользовательского интерфейса, прошли. Вы можете использовать потоки через TThread или через новую библиотеку параллельного программирования , которые очень популярны среди наших разработчиков. Тем не менее, несмотря на то, что параллелизм и многопоточность становятся все более важными, интерфейс отладчика во многих IDE — не только в нашей, но и во всех IDE — по-прежнему в значительной степени ориентирован на однопоточное программирование: например, одновременное наблюдение только за стеком вызовов одного потока.
Этот новый плагин Parnassus Parallel Debugger IDE прямо нацелен на всестороннее понимание вашего приложения, когда оно выполняет несколько задач одновременно. Вы можете изучить все параллельное выполнение, увидеть все потоки сразу и их взаимодействия, с улучшенной разметкой редактора, улучшениями выполнения и пошагового выполнения процесса, улучшениями точек останова и многим другим. Мы считаем, что он добавляет функции, которых нет ни в одной другой IDE. Даже если вы не используете несколько потоков, некоторые из улучшенных пользовательских интерфейсов могут действительно улучшить вашу продуктивность отладки или понимание выполнения вашего приложения!
Parallel Debugger происходит из того же источника, что и Bookmarks и Navigator, два плагина в GetIt, которые добавляют улучшенную навигацию и другие функции в IDE. Они стабильно входят в число самых популярных загрузок на GetIt. Надеемся, новый плагин будет оценен так же!
Вы можете рассчитывать на более подробную информацию о Parallel Debugger в ближайшее время, такую как подробное описание функций, которые вы будете иметь при отладке в Delphi и C ++ Builder, снимки экрана и многое другое. Нам не терпится показать вам!
Гораздо более быстрые компиляторы C ++!
Мы слышим от наших клиентов, что скорость компиляции C ++, особенно с Clang, — это то, что вы действительно хотели бы, чтобы мы увеличили. Что ж, у нас есть кое-что особенное для вас: TwineCompile, свободно доступный плагин в GetIt (бесплатно для всех SKU, включая Pro!), Который может ускорить компиляцию кодовых баз C ++ до 50 раз.
Это не опечатка — помимо увеличения ускорения в зависимости от количества доступных ядер, TwineCompile предлагает несколько впечатляющих методов для других оптимизаций. Это действительно может значительно сократить время, необходимое для создания приложения C ++. Нам это нравится и очень рекомендуется. Сегодня он доступен в GetIt бесплатно и для профессионалов (не только для предприятий и архитекторов).
Кайл Уиллер и Дэвид Миллингтон работают над обновлением для C ++ Builder, в котором они поделятся некоторыми новостями о новых библиотеках и других обновлениях для C ++. Следите за этим!
Совместная работа Delphi и Python
Это особенно интересно для меня, потому что это еще один проект, управляемый сообществом. Создатель PyScripter создал ряд замечательных интеграций между Delphi и Python из RAD Studio. Они были представлены на двух вебинарах за последние пару месяцев с более чем 4000 участников. Это прекрасная возможность расширить инструменты, доступные разработчикам Delphi, и познакомить разработчиков Python с RAD Studio. Сообщество разработчиков Python растет очень быстро, и для многих это первый компьютерный язык (вероятно, им должен был стать Delphi). RAD Studio — это естественный и простой инструмент для этих разработчиков, позволяющий создавать мощные собственные приложения.
Tue Nov 24 2020 22:20:59 GMT+0700 (Western Indonesia Time)
Kürzlich habe ich zusammen mit Mary Kelly ein Webinar geleitet, in dem ich erörtert habe, wie die ISVs von InterBase durch den Einsatz von InterBase schneller innovieren und gleichzeitig ihre Rentabilität und Kapitalrendite verbessern können. Im Anschluss an dieses Webinar wollte ich einige der besprochenen Punkte zusammenfassen.
Warum ISVs InterBase wählen?
Um es einfach auszudrücken – Vertrauen – ISVs vertrauen InterBase, um ihre Geschäftsrisiken zu senken und die hohen Kosten für Datenmanagement und Support zu reduzieren. Gleichzeitig beginnen sie ihre Entwicklung mit einem Stack der erforderlichen Kernfunktionen für Datenspeicherung, Datenschutz und Benutzersicherheit.
Realer Wert des Eigentums
Lassen Sie mich das, was ich meine, mit einer kurzen Geschichte aus meiner eigenen Erfahrung aus erster Hand erzählen. Vor einigen Jahren arbeitete ich als Direktor für einen ISV, als dieser ein .NET-Softwarehaus kaufte. Das .NET-Produkt verwendete MSSQL als Backend und unterstützte ein Viertel der Unternehmen, die von der vorhandenen unterstützten Delphi & InterBase-Anwendung unterstützt wurden. Obwohl es gehostet wurde, betrug der Aufwand für den Support des .NET-Produkts Jahr für Jahr mehr als das Fünffache der Betriebskosten im Vergleich zu InterBase nach dem Kauf.
Der größte Teil der Kosten entstand durch den Einsatz von zwei Vollzeit-DBAs, verglichen mit dem minimalen Schulungsaufwand, der für diejenigen erforderlich war, die InterBase unterstützten. Außerdem war InterBase für den Remote-Einsatz und -Support auf jedem Computertyp des Kunden geeignet. Dies trug dazu bei, das Wertangebot für den Kunden zu verbessern und die Risiken für die Geschäftsanbahnung zu verringern.
InterBase-Funktionen und -Vorteile, die geschäftlichen Nutzen bringen
Eine vollständige Liste der wichtigsten Gründe, warum sich ISVs / OEM-Partner für InterBase entscheiden, wird im Webinar erläutert
Sehr skalierbar
Von einem Computer bis zu Hunderten von Verbindungen auf einem dedizierten Server wächst es problemlos mit Ihnen!
Kleiner Speicherplatz und Platzbedarf auf der Festplatte
Unabhängig vom Gerät läuft InterBase einfach! – Von einem Handy über einen Laptop bis hin zu einem Top-End-Server ist InterBase schlank!
Erschwinglich
Das OEM / VAR-Programm bietet großartige Optionen für ISVs mit maßgeschneiderten Preisen, die auf Ihrer Nutzung basieren.
Einfache Bereitstellung
Weiter> Weiter> Fertig! Sie benötigen keinen Schulungskurs, um den InterBase-Server zum Laufen zu bringen. Dies macht ihn ideal für die kostengünstige Remote-Bereitstellung
Schnell und einfach
InterBase enthält ein Element der Selbstoptimierung. Ist aber auch sehr konfigurierbar.
Zuverlässig
Nahezu null Administrator und automatische Absturzwiederherstellung machen es ideal für die Einbettung in Remote-Bereitstellungen. Selbst wenn der Stecker aus dem Server gezogen wird, erscheint InterBase wieder und geht!
Embedded User Security
Es ist leicht zu übersehen, welchen Wert Sie erhalten (insbesondere in Kombination mit Verschlüsselung), um den Zugriff auf die Datenbank zu steuern. Die vollständige rollbasierte Benutzersicherheit erleichtert die Implementierung.
Ansichten ändern
Datenänderungsverfolgung mit der IoT-preisgekrönten Datenbank.
Die patentierte Änderungsverfolgungsmethode ermöglicht es Tausenden von verbundenen Geräten, Änderungen zu verfolgen, selbst wenn die Verbindung getrennt wird, ohne dass die zentrale Datenbank überlastet wird! – Keine Änderungsprotokolle, Tabellenauslöser oder andere Dinge, die die Datenbank aufblähen und mit der Zeit schwer zu verwalten sind!
Rich Disaster Recovery
Eine großartige Mischung aus Datenbankfunktionen zum Sichern, Wiederherstellen, Speichern usw., die durch die einzigartige Verwendung von Tabellenbereichen noch weiter verbessert wurden.
Plattformübergreifende Unterstützung
Server, Desktop UND Mobile für Windows, Linux, MacOS, iOS und Android.
Starke Verschlüsselung für Unternehmen
On-Disk-Verschlüsselung mit 256-Bit-AES-Stärke im Ruhezustand, die für den Client transparent ist, mit Verschlüsselungsoptionen auf Spaltenebene mit mehreren Verschlüsselungsschlüsseln – InterBase wird von Finanz- und Kassensystemen bis hin zu medizinischer Software weltweit für den Umgang mit finanziellen, persönlichen und medizinischen Daten verwendet Dies ermöglicht es Kunden, eine breite Palette von Industriedatenmanagement- und Sicherheitsstandards zu erreichen.
Enge RAD-Integration
Mit InterBase ist es einfach zu entwickeln, da es von RAD Studio-Kunden häufig verwendet wird.
Die offene API unterstützt auch die direkte Sicherung von Software, was reguläre Verwaltungsaufgaben sehr einfach macht.
Es wird auch häufig von umfangreichen .NET-Anwendungen verwendet und bietet .NET-, ODBC- und JDBC-Treiber.
Das ISV-Geschäftsmodell
Darüber hinaus beschäftigt sich das Webinar auch mit dem Kerngeschäft eines typischen ISVs und dem anderen Wert, den InterBase für ihn bietet.
Ein großer Teil der InterBase-Kundengeschichten, die auf der Embarcadero-Website veröffentlicht werden, beinhaltet immer wieder Kunden, die über die Entwicklung von InterBase sprechen, und selbst wenn sie ihre Entwicklungsumgebung langsamer aktualisiert haben, wie InterBase es ihnen ermöglicht hat, neue Funktionen zu veröffentlichen. Dieser offene Innovationsansatz ermöglicht es ISVs, mit größeren InterBase-Versionen, die ihre eigene F&E ergänzen, einen echten Innovationsschub für ihr Produkt zu erzielen.
Ein gutes Beispiel dafür war die Einführung der transparenten Verschlüsselung auf der Festplatte vor einigen Jahren. Diese serverseitige Funktion, die mit einer einfachen Parameteraktualisierung auf der Client-Seite aktiviert wurde, bot eine reichhaltige Funktionalität und Datenspeicherkompatibilität bei nahezu Null F&E-Ausgaben! In jüngerer Zeit haben Kunden mit Table Spaces die Möglichkeit, ihren Server für größere Einsätze zu beschleunigen, indem sie gezielt festlegen können, welcher Teil der Datenbank auf welches Laufwerk kommt.
Wie auch immer, ich hoffe, dass Sie das Webinar interessant finden, und es wäre schön, von Ihren InterBase-Geschichten zu hören!
Tue Nov 24 2020 22:20:43 GMT+0700 (Western Indonesia Time)
Recientemente realicé un seminario web, junto con Mary Kelly, en el que discutí cómo los ISV de InterBase están innovando más rápido mientras mejoran la rentabilidad y el retorno de la inversión mediante el uso de InterBase. Siguiendo con ese webinar, quería resumir algunos de los puntos discutidos.
¿Por qué los ISV eligen InterBase?
En pocas palabras: Confianza: los ISV confían en InterBase para reducir sus riesgos comerciales y eliminar los grandes costos que existen en torno a la administración y el soporte de datos, mientras que inician su desarrollo con una pila de capacidades básicas requeridas en torno al almacenamiento de datos, la protección de datos y la seguridad del usuario. .
Valor real de propiedad
Permítanme compartir lo que quiero decir con una historia rápida de mi propia experiencia de primera mano. Hace algunos años, trabajé como director de un ISV cuando compró una casa de software .NET. El producto .NET utilizaba MSSQL como backend y respaldaba a una cuarta parte de las empresas que la aplicación existente de Delphi e InterBase compatible. A pesar de que estaba alojado, la sobrecarga de soporte del producto .NET era más de cinco veces superior al costo de ejecución en comparación con InterBase después de la compra, año tras año.
La mayor parte del costo provino de tener 2 administradores de bases de datos a tiempo completo, en comparación con la capacitación mínima que se requería para quienes apoyaban a InterBase. Además, InterBase era adecuado para la implementación y el soporte remotos en cualquier tipo de computadora que tuviera el cliente. Esto ayudó a mejorar la propuesta de valor para el cliente y a reducir los riesgos de conseguir negocios.
Características y beneficios de InterBase que aportan valor empresarial
Una lista completa de las principales razones por las que los socios de ISV / OEM eligen InterBase discutidas en el seminario web incluyen
Altamente escalable
Desde una máquina hasta cientos de conexiones en un servidor dedicado, ¡crece con usted fácilmente!
Pequeña memoria y espacio en disco
Independientemente del dispositivo, InterBase simplemente funciona. – desde un móvil a una computadora portátil a un servidor de gama alta, ¡InterBase es esbelto!
Asequible
El programa OEM / VAR ofrece excelentes opciones para ISV con precios personalizados según su uso.
Implementación simple
Siguiente> Siguiente> ¡Terminado! No necesita un curso de capacitación para poner en funcionamiento el servidor InterBase, lo que lo hace ideal para una implementación remota de bajo costo
Rápido y sencillo
De fábrica, InterBase incluye un elemento de autoajuste. Pero también es altamente configurable.
De confianza
Casi cero administración y recuperación automática de fallos lo hacen ideal para integrarlo en implementaciones remotas. Incluso si se desconecta el servidor, InterBase vuelve a aparecer y funciona.
Seguridad de usuario integrada
Es fácil pasar por alto el valor que obtiene (especialmente cuando se combina con el cifrado) para controlar el acceso a la base de datos. La seguridad del usuario basada en el rollo completo hace que sea fácil de implementar.
Cambiar vistas
Seguimiento de cambios de datos con la base de datos ganadora del premio IoT.
El método de seguimiento de cambios patentado está diseñado para permitir que miles de dispositivos conectados realicen un seguimiento de los cambios, incluso cuando se desconectan sin sobrecarga en la base de datos central. – ¡Sin registros de cambios, activadores de tablas o cualquier otra cosa que hinche la base de datos y se vuelva difícil de administrar con el tiempo!
Rica recuperación ante desastres
Una gran combinación de funciones de base de datos para copia de seguridad, restauración, volcado, etc., mejorada aún más con un uso exclusivo de Table Spaces.
Soporte multiplataforma
Servidor, escritorio y dispositivos móviles que abarcan Windows, Linux, macOS, iOS y Android.
Cifrado fuerte de “grado empresarial”
Cifrado en disco de 256 bits AES en reposo que es transparente para el cliente, con opciones de cifrado a nivel de columna con múltiples claves de cifrado: InterBase es utilizado por todo, desde sistemas financieros y POS hasta software médico a nivel mundial para tratar con datos financieros, personales y médicos , lo que permite a los clientes alcanzar una amplia gama de estándares de seguridad y gestión de datos de la industria.
Estrecha integración RAD
Es fácil de desarrollar con InterBase, ya que los clientes de RAD Studio lo utilizan ampliamente,
Su API abierta también admite la copia de seguridad directa desde el software, lo que simplifica las tareas de administración habituales.
También es ampliamente utilizado por numerosas aplicaciones .Net y ofrece controladores .Net, ODBC y JDBC.
El modelo de negocio de ISV
Además de lo anterior, el webinar también dedica tiempo a analizar el negocio clave de un ISV típico y el otro valor que InterBase hace posible para ellos.
Una gran parte de las historias de clientes de InterBase compartidas en el sitio web de Embarcadero incluyen una y otra vez a clientes que hablan sobre la evolución de InterBase, e incluso cuando han tardado más en actualizar su entorno de desarrollo, cómo InterBase les ha permitido lanzar nuevas funciones. Este enfoque de innovación abierta permite a los ISV obtener un impulso de innovación real para su producto con importantes lanzamientos de InterBase, complementando su propia I + D.
Un buen ejemplo de esto fue la incorporación del cifrado transparente en disco hace algunos años. Esta función del lado del servidor, habilitada con una simple actualización de parámetros en el lado del cliente, proporcionó una gran funcionalidad y cumplimiento de almacenamiento de datos con un gasto casi nulo en I + D. Más recientemente, Table Spaces ha permitido a los clientes acelerar su servidor para implementaciones más grandes al apuntar qué parte de la base de datos va en qué unidad.
De todos modos, espero que el seminario web le resulte interesante y sería fantástico conocer sus historias de InterBase .
Tue Nov 24 2020 22:20:14 GMT+0700 (Western Indonesia Time)
Recentemente, conduzi um webinar, ao lado de Mary Kelly, discutindo como os ISVs do InterBase estão inovando mais rápido enquanto aumentam a lucratividade e o retorno sobre o investimento usando o InterBase. Na sequência desse webinar, eu gostaria de resumir alguns dos pontos discutidos.
Por que os ISVs escolhem o InterBase?
Simplificando – Confie – o ISV confia no InterBase para reduzir seus riscos de negócios e cortar grandes custos que existem em torno de gerenciamento e suporte de dados, enquanto inicia seu desenvolvimento com uma pilha de recursos essenciais necessários em torno de armazenamento de dados, proteção de dados e segurança do usuário .
Valor real de propriedade
Deixe-me compartilhar o que quero dizer com uma história rápida de minha própria experiência em primeira mão. Há alguns anos, trabalhei como Diretor de um ISV quando ele comprou uma casa de software .NET. O produto .NET usava MSSQL como backend e suportava um quarto dos negócios que o aplicativo Delphi & InterBase existente suportava. Embora fosse hospedado, a sobrecarga de suporte ao produto .NET era mais de 5 vezes o custo de execução em comparação com o InterBase após a compra, ano após ano.
A maior parte do custo veio de ter 2 DBA’s em tempo integral, em comparação com o treinamento mínimo necessário para aqueles que suportam o InterBase. Além disso, o InterBase era adequado para implantação remota e suporte em qualquer tipo de computador que o cliente tivesse. Isso ajudou a melhorar a proposta de valor para o cliente e a reduzir os riscos para o desembarque de negócios.
Recursos e benefícios do InterBase que agregam valor ao negócio
Uma lista completa dos principais motivos pelos quais os parceiros ISVs / OEM escolhem o InterBase discutidos no webinar inclui
Altamente escalável
De uma máquina a centenas de conexões em um servidor dedicado, ele cresce facilmente com você!
Memória pequena e pegada no disco
Independentemente do dispositivo, o InterBase apenas roda! – de um celular a um laptop e a um servidor de ponta, o InterBase é enxuto!
Acessível
O programa OEM / VAR oferece ótimas opções para ISVs com preços sob medida com base no seu uso.
Implantação Simples
Próximo> Próximo> Concluído! Você não precisa de um curso de treinamento para colocar o servidor InterBase em funcionamento, o que o torna ideal para implantação remota de baixo custo
Rápido e Simples
Fora da caixa, o InterBase tem um elemento de autoajuste incluído. Mas também é altamente configurável.
Confiável
Quase zero de administração e recuperação automática de falhas o tornam ideal para integração em implantações remotas. Mesmo que o plugue seja retirado do servidor, o InterBase volta a funcionar e vai!
Segurança do usuário incorporado
É fácil ignorar o valor que você obtém (especialmente quando combinado com a criptografia) para controlar o acesso ao banco de dados. A segurança do usuário baseada em rolagem completa torna a implementação simples.
Alterar visualizações
Acompanhamento de alterações de dados com o banco de dados vencedor do IoT Award.
O método patenteado de rastreamento de alterações foi projetado para permitir que milhares de dispositivos conectados rastreiem alterações, mesmo quando desconectados sem qualquer sobrecarga no banco de dados central! – Sem logs de alterações, gatilhos de tabela ou qualquer outra coisa que incha o banco de dados e se torna difícil de gerenciar com o tempo!
Rich Disaster Recovery
Uma grande combinação de recursos de banco de dados para backup, restauração, despejo, etc, e aprimorada ainda mais com o uso exclusivo de espaços de tabela.
Suporte multiplataforma
Servidor, desktop e móvel abrangendo Windows, Linux, macOS, iOS e Android.
Criptografia forte de “nível empresarial”
Criptografia em disco de 256 bits AES em repouso que é transparente para o cliente, com opções de criptografia em nível de coluna com várias chaves de criptografia – o InterBase é usado por tudo, desde sistemas financeiros e POS a software médico globalmente para lidar com dados financeiros, pessoais e médicos , permitindo que os clientes alcancem uma ampla gama de padrões de segurança e gerenciamento de dados do setor.
Integração RAD apertada
É fácil de desenvolver com o InterBase, sendo amplamente utilizado por clientes RAD Studio,
Sua API aberta também suporta backup direto de software, tornando as tarefas administrativas regulares muito simples.
Também é amplamente utilizado por aplicativos .Net consideráveis e oferece drivers .Net, ODBC e JDBC.
O modelo de negócios ISV
Além do que foi dito acima, o webinar também dedica tempo examinando os principais negócios de um ISV típico e o outro valor que o InterBase torna possível para eles.
Grande parte das histórias de clientes do InterBase compartilhadas no site da Embarcadero incluem, repetidamente, clientes falando sobre a evolução do InterBase, e mesmo quando eles demoraram para atualizar seu ambiente de desenvolvimento, como o InterBase permitiu que eles lançassem novos recursos. Esta abordagem de inovação aberta permite que os ISVs obtenham um verdadeiro impulso de inovação para seus produtos com os principais lançamentos do InterBase, complementando sua própria P&D.
Um bom exemplo disso foi a adição de criptografia transparente em disco há alguns anos. Este recurso do lado do servidor, habilitado com uma atualização de parâmetro simples no lado do cliente, forneceu funcionalidade rica e conformidade de armazenamento de dados com quase nenhum gasto de P&D! Mais recentemente, o Table Spaces permitiu que os clientes acelerassem seus servidores para implantações maiores, direcionando qual parte do banco de dados vai em qual unidade.
De qualquer forma, espero que você ache o webinar interessante, e seria ótimo ouvir sobre suas histórias no InterBase !
Tue Nov 24 2020 22:19:56 GMT+0700 (Western Indonesia Time)
Недавно я вместе с Мэри Келли провел веб-семинар, на котором обсуждал, как InterBase ISV быстрее внедряют инновации, одновременно повышая прибыльность и окупаемость инвестиций за счет использования InterBase. Продолжая этот веб-семинар, я хотел резюмировать некоторые из обсуждаемых вопросов.
Почему независимые поставщики программного обеспечения выбирают InterBase?
Проще говоря — Доверие — ISV доверяют InterBase, чтобы снизить свои бизнес-риски и сократить большие затраты, связанные с управлением и поддержкой данных, и одновременно начать разработку со стеком необходимых основных возможностей в области хранения данных, защиты данных и безопасности пользователей. .
Реальная стоимость владения
Позвольте мне поделиться тем, что я имею в виду, коротким рассказом из моего личного опыта. Несколько лет назад я работал директором независимого поставщика программного обеспечения, когда он купил компанию по разработке программного обеспечения .NET. Продукт .NET использовал MSSQL в качестве бэкэнда и поддерживал четверть предприятий, что и существующее поддерживаемое приложение Delphi & InterBase. Несмотря на то, что он был размещен, накладные расходы на поддержку продукта .NET в 5 раз превышали затраты на запуск по сравнению с InterBase после покупки в годовом исчислении.
Наибольшая часть затрат приходилась на 2 штатных администраторов баз данных по сравнению с минимальным обучением, которое требовалось для тех, кто поддерживает InterBase. Кроме того, InterBase подходила для удаленного развертывания и поддержки на любом компьютере клиента. Это помогло улучшить ценностное предложение для клиента и снизить риски для бизнеса.
Возможности и преимущества InterBase, которые приносят пользу для бизнеса
Полный список основных причин, по которым ISV / OEM-партнеры выбирают InterBase, обсужденный на веб-семинаре, включает:
Масштабируемость
От одного компьютера до сотен подключений на выделенном сервере, он легко растет вместе с вами!
Малая память и занимаемая площадь на диске
Независимо от устройства InterBase просто запускается! — от мобильного телефона до портативного компьютера и до топового сервера — InterBase экономична!
Доступный
Программа OEM / VAR предлагает отличные возможности для независимых поставщиков программного обеспечения с индивидуальными ценами в зависимости от вашего использования.
Простое развертывание
Далее> Далее> Готово! Вам не нужен учебный курс, чтобы запустить сервер InterBase, что делает его идеальным для удаленного и недорогого развертывания.
Быстро и просто
По умолчанию в InterBase включен элемент самонастройки. Но также легко настраивается.
Надежный
Практически полное отсутствие администратора и автоматическое восстановление после сбоев делают его идеальным для встраивания в удаленные развертывания. Даже если сервер выдернут из розетки, InterBase снова появится и уйдет!
Встроенная безопасность пользователя
Легко упустить из виду ценность, которую вы получаете (особенно в сочетании с шифрованием) для управления доступом к базе данных. Безопасность пользователей на основе полного списка упрощает реализацию.
Изменить просмотры
Отслеживание изменений данных с помощью удостоенной награды IoT базы данных.
Запатентованный метод отслеживания изменений позволяет тысячам подключенных устройств отслеживать изменения, даже если они отключены без каких-либо накладных расходов на центральную базу данных! — Никаких журналов изменений, триггеров таблиц или чего-либо еще, что раздувает базу данных и со временем становится трудно управлять!
Богатое аварийное восстановление
Великолепное сочетание функций базы данных для резервного копирования, восстановления, дампа и т. Д., А также еще больше улучшенных за счет уникального использования табличных пространств.
Кросс-платформенная поддержка
Серверные, настольные и мобильные, охватывающие Windows, Linux, macOS, iOS и Android.
Надежное шифрование корпоративного уровня
256-битное шифрование AES на диске в состоянии покоя, прозрачное для клиента, с вариантами шифрования на уровне столбцов с несколькими ключами шифрования — InterBase используется во всем, от финансовых и торговых точек до медицинского программного обеспечения во всем мире для работы с финансовыми, личными и медицинскими данными , позволяя клиентам достичь широкого диапазона отраслевых стандартов управления данными и безопасности.
Тесная интеграция с RAD
С InterBase легко разрабатывать, он широко используется клиентами RAD Studio,
Его открытый API также поддерживает прямое резервное копирование из программного обеспечения, что упрощает выполнение обычных административных задач.
Он также широко используется значительными приложениями .Net и предлагает драйверы .Net, ODBC и JDBC.
Бизнес-модель ISV
В дополнение к вышесказанному, веб-семинар также посвящает время изучению ключевой деятельности типичного независимого поставщика программного обеспечения и другой ценности, которую InterBase делает для них возможной.
Большая часть историй клиентов InterBase, публикуемых на веб-сайте Embarcadero, включает в себя снова и снова, как клиенты говорят об эволюции InterBase, и даже когда они медленнее обновляли свою среду разработки, как InterBase позволила им выпустить новые функции. Такой подход к открытым инновациям позволяет независимым поставщикам программного обеспечения получить реальный инновационный импульс для своих продуктов с помощью основных выпусков InterBase, дополняющих их собственные исследования и разработки.
Хорошим примером этого было добавление прозрачного шифрования на диске несколько лет назад. Эта серверная функция, доступная с помощью простого обновления параметров на стороне клиента, обеспечивала обширную функциональность и соответствие хранилищу данных практически без затрат на НИОКР! Совсем недавно табличные пространства позволили клиентам ускорить работу своего сервера для более крупных развертываний, указав, какая часть базы данных находится на каком диске.
В любом случае, я надеюсь, что вы найдете этот вебинар интересным, и было бы здорово услышать о ваших историях об InterBase !
2つ目の改善ポイントは、現行のサポートターゲットプラットフォームへのフォーカスです。 RAD Studio 10.4.1のリリース後に、AppleとGoogleによってリリースされたOSの新バージョンとの完全な互換性を提供する計画です。 現在、これらのプラットフォームをターゲットにすることはできますが、(回避策ではなく)適切に対処したい未解決の問題がいくつかあります。 目標は、以下を完全にサポートすることです。
VCLでは、これまで数回のリリースでHigh DPIをサポートしてきましたが、10.5では、VCLを使用するRAD Studio IDEでもHigh DPIを完全にサポートする計画です。これにより、さまざまな解像度とスケールの画面間でウィンドウを移動する場合を含め、最新の高解像度スクリーンのすべてで鮮明なレンダリングが可能になります。
Mon Nov 23 2020 22:19:38 GMT+0700 (Western Indonesia Time)
Das Archäologische Museum der Präfektur Saitobaru in Miyazaki hat mit „Saitobaru Archaeological Expo Navi“ eine App für Smartphones entwickelt, die die Navigation im Museum, die Führung durch die Exponate usw. in mehreren Sprachen ermöglicht. Dabei wurden Lösungen von Embarcadero und Marubeni Information Systems verwendet. did. Diese Lösung besteht aus einer energiesparenden Bake, die Radiowellen aussendet (unter Verwendung von „rapiNAVI Air2“ von Marubeni Information Systems), und der Softwareentwicklungsfunktion „Beacon Fence“ von Embarcadero, die mit Hilfe dieser Bake die Position ermittelt. Im Archäologischen Museum von Saitobaru können Sie das hauseigene Navigationssystem „Saitobaru Archaeological Expo Navi“ verwenden, das Baken verwendet. Mit diesem System können Sie den aktuellen Standort des Museums auf Ihrem Smartphone abfragen und die Erklärung der Exponate vor Ihnen in vier Sprachen lesen: Japanisch, Englisch, Chinesisch und Koreanisch. In dieser Sitzung stellen wir vor, wie dieses System im Museum aufgebaut wurde, und geben einen Überblick über das System und die Funktionen von RAD Studio / Delphi + BeaconFence, die verwendet werden.
Mon Nov 23 2020 22:19:15 GMT+0700 (Western Indonesia Time)
El Museo Arqueológico de la Prefectura de Miyazaki Saitobaru ha creado una aplicación para teléfonos inteligentes, “Saitobaru Archaeological Expo Navi”, que proporciona navegación en el museo, orientación sobre exhibiciones, etc. en varios idiomas utilizando soluciones proporcionadas por Embarcadero y Marubeni Information Systems. hizo. Esta solución consiste en una baliza de ahorro de energía que emite ondas de radio (utilizando “rapiNAVI Air2” fabricado por Marubeni Information Systems) y la función de desarrollo de software de Embarcadero “Beacon Fence” que detecta la posición mediante esta baliza. En el Museo Arqueológico de Saitobaru, puede utilizar el sistema de navegación interno “Saitobaru Archaeological Expo Navi” que utiliza balizas. Con este sistema, puede verificar la ubicación actual del museo en su teléfono inteligente y leer la explicación de las exhibiciones frente a usted en cuatro idiomas: japonés, inglés, chino y coreano. En esta sesión, presentaremos cómo se construyó este sistema en el museo, junto con una descripción general del sistema y las características de RAD Studio / Delphi + BeaconFence utilizadas.
Mon Nov 23 2020 22:18:14 GMT+0700 (Western Indonesia Time)
O Museu Arqueológico da Prefeitura de Miyazaki Saitohara construiu um aplicativo para smartphones, “Saitohara Archaeological Expo Navi”, que fornece navegação no museu, orientação sobre exposições, etc. em vários idiomas usando soluções fornecidas pela Embarcadero and Marubeni Information Systems. fez. Esta solução consiste em um farol de economia de energia que emite ondas de rádio (usando “rapiNAVI Air2” fabricado pela Marubeni Information Systems) e a função de desenvolvimento de software da Embarcadero “Beacon Fence” que detecta a posição usando este farol. No Museu Arqueológico de Saitohara, você pode usar o sistema de navegação interno “Saitohara Archaeological Expo Navi” que utiliza faróis. Com este sistema, você pode verificar a localização atual do museu em seu smartphone e ler a explicação das exposições à sua frente em quatro idiomas: japonês, inglês, chinês e coreano. Nesta sessão, apresentaremos como este sistema foi construído no museu, juntamente com uma visão geral do sistema e os recursos do RAD Studio / Delphi + BeaconFence usados.
Mon Nov 23 2020 22:17:50 GMT+0700 (Western Indonesia Time)
Археологический музей Сайтохара префектуры Миядзаки создал приложение для смартфонов Saitohara Archaeological Expo Navi, которое обеспечивает навигацию по музею, руководство по экспонатам и т. Д. На нескольких языках с использованием решений, предоставленных Embarcadero и Marubeni Information Systems. сделал. Это решение состоит из энергосберегающего маяка, излучающего радиоволны (с использованием «rapiNAVI Air2», производимого Marubeni Information Systems), и функции разработки программного обеспечения Embarcadero «Beacon Fence», которая определяет местоположение с помощью этого маяка. В археологическом музее Сайтохара вы можете использовать внутреннюю навигационную систему Saitohara Archaeological Expo Navi, в которой используются маяки. С помощью этой системы вы можете проверить текущее местоположение музея на своем смартфоне и прочитать объяснение экспонатов перед вами на четырех языках: японском, английском, китайском и корейском. На этом занятии мы расскажем, как эта система была построена в музее, а также сделаем обзор системы и используемых функций RAD Studio / Delphi + BeaconFence.
Sun Nov 22 2020 21:54:38 GMT+0700 (Western Indonesia Time)
Вы когда-нибудь заходили на веб-сайт на своем мобильном устройстве и обнаруживали, что он отформатирован для настольного компьютера и почти не читается на 5-дюймовом экране? Подобные проблемы возникают и у пользователей, использующих экраны с высоким разрешением. По мере распространения экранов 4K и роста спроса потребителей на 8K, Важно настроить пользовательские интерфейсы, чтобы формы и элементы управления не становились нечитаемо маленькими на мониторах с высоким разрешением. В RAD Studio 10.3 Rio и Rio Update 2 для решения этой проблемы были введены улучшенные элементы управления для приложений с высоким разрешением, а также Рэй Конопка из Raize Software, Inc. здесь, чтобы научить нас, как максимально использовать их преимущества. Всего за семь дней вы узнаете, как использовать высокий DPI в приложениях VCL, и все разработчики, любители и энтузиасты RAD Studio, желающие получить новые методы, чтобы оставаться актуальными в нашем меняющемся ПО пейзаж.
DelphiCon 2020 предлагает десять выступлений и четыре экспертные панели от технических партнеров Embarcadero и самых ценных профессионалов, охватывающих весь спектр программного обеспечения от образования до доступа к промышленным базам данных. Приходите за знаниями High-DPI и уходите с более глубоким пониманием веб-приложений Delphi. Конференция бесплатна и открыта для публики. Зарегистрируйтесь сейчас, нажав кнопку «Сохранить мое место» на сайте delphicon.embarcadero.com!
Sun Nov 22 2020 21:54:31 GMT+0700 (Western Indonesia Time)
Você já acessou um site em seu dispositivo móvel e descobriu que ele foi formatado para desktop e quase ilegível em uma tela de 5 “? Problemas semelhantes ocorrem para usuários que executam telas de alto DPI. Conforme as telas de 4K proliferam e a pressão do consumidor por 8K aumenta, é importante ajustar as interfaces do usuário para evitar que formulários e controles se tornem ilegíveis em monitores de alta resolução. O RAD Studio 10.3 Rio e o Rio Update 2 introduziram controles aprimorados para aplicativos de alto DPI para solucionar esse problema e Ray Konopka da Raize Software, Inc. está aqui para nos ensinar como maximizar suas vantagens. Em apenas sete dias, Leveraging High DPI in VCL Applications é uma palestra obrigatória para todos os desenvolvedores, amadores e entusiastas do RAD Studio que buscam obter novas técnicas para permanecer relevantes em nosso software em constante mudança panorama.
O DelphiCon 2020 oferece dez palestras e quatro painéis de especialistas por parceiros de tecnologia da Embarcadero e Profissionais Mais Valiosos, abrangendo uma gama de software, desde educação até acesso a banco de dados industrial. Venha pelo conhecimento de High-DPI e saia com um maior entendimento dos aplicativos da web Delphi. A conferência é gratuita e aberta ao público. Inscreva-se agora clicando no botão “Salvar meu assento” em delphicon.embarcadero.com!
Sun Nov 22 2020 21:54:13 GMT+0700 (Western Indonesia Time)
¿Alguna vez accedió a un sitio web en su dispositivo móvil y descubrió que estaba formateado para escritorio y era casi ilegible en una pantalla de 5 “? Se producen problemas similares para los usuarios que ejecutan pantallas de alto DPI. A medida que proliferan las pantallas 4K y aumenta la presión del consumidor por 8K, Es importante ajustar las interfaces de usuario para evitar que los formularios y los controles se vuelvan increíblemente pequeños en monitores de alta resolución. RAD Studio 10.3 Rio y Rio Update 2 introdujeron controles mejorados para aplicaciones de alto DPI para solucionar este problema y Ray Konopka de Raize Software, Inc. está aquí para enseñarnos cómo aprovechar al máximo sus ventajas. A solo siete días de distancia, Aprovechar el alto DPI en las aplicaciones VCL es una charla obligada para todos los desarrolladores, aficionados y entusiastas de RAD Studio que buscan obtener nuevas técnicas para mantenerse relevantes en nuestro software cambiante paisaje.
DelphiCon 2020 ofrece diez charlas y cuatro paneles de expertos de los socios tecnológicos de Embarcadero y los Profesionales Más Valiosos que abarcan la gama de software desde la educación hasta el acceso a bases de datos industriales. Venga por el conocimiento de High-DPI y salga con una mayor comprensión de las aplicaciones web Delphi. La conferencia es gratuita y abierta al público. Regístrese ahora haciendo clic en el botón “Guardar mi asiento” en delphicon.embarcadero.com.
Sun Nov 22 2020 21:46:05 GMT+0700 (Western Indonesia Time)
DelphiFeeds.com был запущен братьями Гурок примерно в 2005 году. С тех пор продукт Gurock TestRail стал действительно популярным, и они были так заняты, что у них больше не было времени на поддержку DelphiFeeds. Он продолжал собирать каналы и публиковать заголовки, но больше не добавлял обновленные источники каналов. Тем временем мы видели, что новые сайты, такие как BeginEnd.net и совсем недавно DelphiMagazine.com, пришли с обновленными списками каналов, но DelphiFeeds продолжал оставаться фактическим источником новостей для многих в сообществе.
Хотя DelphiFeeds никогда не умирал, сегодня он возрождается. Работает на совершенно новом сервере, все старые каналы и несколько обновленных новых. Со временем будут добавляться и обновляться новые источники каналов, а старые удаляться. Ни одна из предыдущих статей о тенденциях или учетных записей пользователей не была перенесена, и регистрация новых учетных записей пользователей еще не включена, но все это и многое другое скоро появится.
Если у вас есть другой новостной сайт, который вы предпочитаете, это нормально, но это не так, тогда я бы порекомендовал вам проверить новый DelphiFeeds и следите за обновлениями и обновлениями!
Sat Nov 21 2020 22:17:28 GMT+0700 (Western Indonesia Time)
Der Entwickler Zudomon (Nick Pützer) hat ein beeindruckendes prozedurales Spiel namens StoneQuest und eine 3D-Engine in Delphi entwickelt. Seit 2011 hat er über 12.000 Stunden in die Entwicklung der Engine und des Spiels investiert. Das gesamte Spiel und der Inhalt sind weniger als 15 MB groß! Eines der Ziele des Entwicklers ist es, dass er es vollständig selbst in Delphi erstellt. Das aktuelle Gameplay erinnert an Minecraft. Laut dem Entwickler „verwende ich eine Menge prozeduralen Inhalt. Alle Modelle werden nur durch Code erstellt. Das bedeutet, dass ich später viele verschiedene Modelle daraus machen kann! Meine Engine ist in der Lage, Mikrogeometrie über die ganze Welt zu verbreiten, wirklich winzige 3D-Modelle. Jeder Grashalm und jede Kleepflanze ist echt und interagiert mit den Spielern. Jede Würfelseite der Voxelwelt hat ihre eigene Textur. Ich habe bisher nur einige wenige prozedurale Texturen. Sie wiederholen sich nicht. Es gibt dynamische volumetrische 3D-Wolken. Und volumetrische Nebel im Tal, wo Sonnenstrahlen durch die Bäume scheinen. Für mich ist atmosphärisch und Eintauchen eine sehr wichtige Sache„. Das Projekt befindet sich noch in der aktiven Entwicklung, aber Sie können es in seinem aktuellen Zustand herunterladen und abspielen. An diesem Punkt ist es ein Kunstwerk, das schön anzusehen ist.
Sat Nov 21 2020 22:17:14 GMT+0700 (Western Indonesia Time)
El desarrollador Zudomon (Nick Pützer) ha estado construyendo un impresionante juego de procedimientos llamado StoneQuest y un motor 3D en Delphi. Ha invertido más de 12.000 horas desde 2011 en la construcción del motor y el juego. ¡Todo el juego y el contenido tienen menos de 15 MB de tamaño! Uno de los objetivos del desarrollador es que lo construya él mismo en Delphi. La jugabilidad actual recuerda a Minecraft. Según el desarrollador, “utilizo mucho contenido de procedimiento. Todos los modelos se crean solo mediante código. Esto significa que, más tarde, puedo hacer muchos modelos diferentes a partir de ellos. Mi motor es capaz de difundir la microgeometría por todo el mundo, modelos 3D realmente diminutos. . Cada brizna de hierba y planta de trébol es real e interactúa con los jugadores. Cada cara de cubo del mundo vóxel tiene su propia textura. Solo tengo unas pocas texturas de procedimiento todavía. No se repiten. Hay nubes dinámicas volumétricas en 3D. Y volumétricas niebla en el valle, donde los rayos del sol brillan a través de los árboles. Para mí la atmósfera y la inmersión es algo muy importante “. El proyecto aún está en desarrollo activo, pero puede descargarlo y reproducirlo en su estado actual. En este punto es una obra de arte hermosa de contemplar.
Sat Nov 21 2020 22:16:43 GMT+0700 (Western Indonesia Time)
O desenvolvedor Zudomon (Nick Pützer) está construindo um jogo processual impressionante chamado StoneQuest e um motor 3D em Delphi. Ele dedicou mais de 12.000 horas desde 2011 para construir o motor e o jogo. Todo o jogo e conteúdo têm menos de 15 MB! Um dos objetivos do desenvolvedor é construí-lo inteiramente em Delphi. A jogabilidade atual é uma reminiscência do Minecraft. De acordo com o desenvolvedor “Eu uso muito conteúdo procedural. Todos os modelos são criados apenas por código. Isso significa que depois posso fazer muitos modelos diferentes deles! Meu motor é capaz de espalhar a microgeometria pelo mundo, modelos 3D minúsculos reais . Cada folha de grama e cada planta de trevo são reais e interagem com os jogadores. Cada face cúbica do mundo do voxel tem sua própria textura. Tenho apenas algumas texturas procedimentais ainda. Elas não se repetem. Existem nuvens dinâmicas volumétricas em 3D. E volumétricas nevoeiro no vale, onde os raios de sol brilham entre as árvores. Para mim, a atmosfera e a imersão são muito importantes. ” O projeto ainda está em desenvolvimento ativo, mas você pode baixá-lo e reproduzi-lo em seu estado atual. Neste ponto, é uma obra de arte bonita de se ver.
Sat Nov 21 2020 22:16:28 GMT+0700 (Western Indonesia Time)
Разработчик Зудомон (Ник Пютцер) создал впечатляющую процедурную игру под названием StoneQuest и 3D-движок на Delphi. С 2011 года он потратил более 12 000 часов на создание движка и игры. Размер всей игры и содержимого составляет менее 15 МБ! Одна из целей разработчика состоит в том, чтобы он сам построил его на Delphi. Текущий игровой процесс напоминает Майнкрафт. По словам разработчика, «Я использую много процедурного контента. Все модели создаются только с помощью кода. Это означает, что позже я могу делать из них много разных моделей! Мой движок может распространять микрогеометрию по всему миру, настоящие крошечные 3D-модели. . Каждая травинка и растение клевера реальны и взаимодействуют с игроками. Каждая грань куба воксельного мира имеет свою собственную текстуру. У меня пока всего несколько процедурных текстур. Они не повторяются. Есть динамические объемные трехмерные облака. И объемные туман в долине, где солнечные лучи просвечивают сквозь деревья. Для меня атмосфера и погружение очень важны ». Проект все еще находится в активной разработке, но вы можете загрузить и воспроизвести его в текущем состоянии. На данный момент это произведение искусства, на которое приятно смотреть.
Fri Nov 20 2020 22:16:13 GMT+0700 (Western Indonesia Time)
OptiFolio ist eine fortschrittliche interaktive Software zur Portfoliooptimierung, die in Delphi entwickelt wurde. Nach Angaben des Entwicklers „kann OptiFolio eine interaktive Visualisierung aller möglichen Anlagestrategien für jede beliebige Gruppe von Finanzanlagen erstellen. Die extreme Ausführungsgeschwindigkeit des kompilierten Codes von Delphi ermöglicht die Untersuchung von Millionen von Strategien pro Sekunde. Diese globale Perspektive realisierbarer Portfolios hilft Anlegern auf der ganzen Welt, ihre besten langfristigen Strategien zu identifizieren„. Einige seiner Portfolio-Optimierungsfunktionen umfassen: Wenden Sie quasi-stochastische und stochastische Optimierungsmethoden an, finden Sie globale Optimierungen auch bei zahlreichen und komplexen Einschränkungen, berichten Sie die Zusammensetzung jedes Punktes entlang der Effizienzgrenze, und speichern Sie optimale Portfolios für weitere Analysen. Darüber hinaus verfügt es über Leistungsstatistiken zur Berechnung der erwarteten Rendite, der Standardabweichung und des bedingten Value-at-Risk und zur Verwendung multivariater Kopula zur Prognose der Leistung jedes Portfolios.
Fri Nov 20 2020 22:15:54 GMT+0700 (Western Indonesia Time)
OptiFolio es un software de optimización de cartera interactivo avanzado integrado en Delphi. Según el desarrollador, “OptiFolio puede producir una visualización interactiva de todas las estrategias de inversión posibles para cualquier conjunto de activos financieros. La velocidad de ejecución extrema del código compilado de Delphi hace posible examinar millones de estrategias por segundo. Esta perspectiva global de carteras viables ayuda a los inversores en el mundo para identificar sus mejores estrategias a largo plazo “. Algunas de sus características de optimización de portafolios incluyen: Aplicar métodos de optimización cuasi-estocásticos y estocásticos, Encontrar óptimos globales incluso con numerosas y complejas restricciones, Informar la composición de cada punto a lo largo de la frontera eficiente y Guardar portafolios óptimos para un análisis más detallado. Además, tiene estadísticas de rendimiento para calcular el rendimiento esperado, la desviación estándar y el valor en riesgo condicional y utilizar cópulas multivariadas para pronosticar el rendimiento de cualquier cartera.
Fri Nov 20 2020 22:15:21 GMT+0700 (Western Indonesia Time)
OptiFolio é um software de otimização de portfólio interativo avançado desenvolvido em Delphi. De acordo com o desenvolvedor, “OptiFolio pode produzir uma visualização interativa de todas as estratégias de investimento possíveis para qualquer conjunto de ativos financeiros. A velocidade de execução extrema do código compilado da Delphi torna possível examinar milhões de estratégias por segundo. Esta perspectiva global de carteiras viáveis ajuda os investidores ao redor o mundo para identificar suas melhores estratégias de longo prazo. ” Alguns de seus recursos de otimização de portfólio incluem: Aplicar métodos de otimização quase estocásticos e estocásticos, Encontrar ótimos globais mesmo com numerosas e complexas restrições, Relatar a composição de cada ponto ao longo da fronteira eficiente e Salvar portfólios ideais para análise posterior. Além disso, possui estatísticas de desempenho para calcular o retorno esperado, o desvio padrão e o valor em risco condicional e usar cópulas multivariadas para prever o desempenho de qualquer portfólio.
Fri Nov 20 2020 22:14:55 GMT+0700 (Western Indonesia Time)
OptiFolio — это продвинутое интерактивное программное обеспечение для оптимизации портфолио, построенное на Delphi. По словам разработчика, «OptiFolio может производить интерактивную визуализацию всех возможных инвестиционных стратегий для любого заданного набора финансовых активов. Чрезвычайная скорость выполнения скомпилированного кода Delphi позволяет исследовать миллионы стратегий в секунду. Эта глобальная перспектива возможных портфелей помогает инвесторам. миру, чтобы определить свои лучшие долгосрочные стратегии ». Некоторые из функций оптимизации портфеля включают в себя: применение квазистохастических и стохастических методов оптимизации, поиск глобальных оптимумов даже с многочисленными и сложными ограничениями, отчет о составе каждой точки вдоль эффективной границы и сохранение оптимальных портфелей для дальнейшего анализа. Кроме того, в нем есть статистика производительности для расчета ожидаемой доходности, стандартного отклонения и условной стоимости, подверженной риску, а также использования многомерных копул для прогнозирования производительности любого портфеля.
Fri Nov 20 2020 21:36:25 GMT+0700 (Western Indonesia Time)
Desde o lançamento do Delphi e C ++ Builder 10.4, criamos mais maneiras para os desenvolvedores facilmente migrarem e atualizarem seus aplicativos legados existentes do Borland Delphi e C ++ Builder para novas versões modernizadas. Embora existam muitas razões pelas quais alguém deve atualizar para a versão mais recente, às vezes não parece a ideia mais viável. Pode ser uma tarefa difícil quando você considera a migração de seus dados de uma plataforma que funcionou por tantos anos ou uma camada de acesso a dados com a qual você não precisa se preocupar.
Com muitos aplicativos Borland, é comum ter o BDE como a camada de acesso aos dados para aplicativos Delphi e C ++ Builder, mas com o passar do tempo, o BDE ficou no passado. As tecnologias mais recentes se juntaram às fileiras e ultrapassaram as capacidades do BDE de 32 bits que todos nós amamos.
A primeira etapa para remover o BDE de seu aplicativo é determinar os componentes de acesso a dados pelos quais você deseja substituí-lo. Existem algumas opções que você pode usar, incluindo UniDAC e IBeXpress. Neste artigo, estarei usando FireDAC, o conjunto de componentes de acesso a dados incluído nas edições RAD Studio, Delphi e C ++ Builder Enterprise e Architect. Para obter mais informações sobre FireDAC, verifique o FireDAC Docwiki.
Migração de BDE para FireDAC
Alterar as estruturas que você usa para acessar seus dados ficou mais fácil ao longo dos anos. Agora temos ferramentas como reFind (específico para Delphi) para BDE e DBExpress, ferramenta de migração BDE para FireDAC do Delphi Parser para C ++ Builder e Delphi, e muitas outras ferramentas disponíveis para migrações. Confira este vídeo abaixo, onde mostramos como usar a ferramenta reFind para migrar dos componentes BDE em um formulário para o FireDAC.
Fontes de dados BDE para InterBase
Depois de migrar seus componentes em seu aplicativo, em alguns casos, você pode ficar com o banco de dados que possui. Embora FireDAC suporte Paradox e outros bancos de dados de desktop por meio de ODBC, ele contém vários drivers que permitem a conexão a um grande número de bancos de dados, como Oracle, DB2, MySQL, MSSQL, InterBase / Firebird, etc.
Embora você possa usar os recursos de importação e exportação de dados do InterBase combinados com uma ferramenta de design de banco de dados que inverte e encaminha o esquema de seu banco de dados, existem ferramentas disponíveis que ajudam a reduzir o incômodo neste processo. Uma dessas ferramentas é o InterBase Datapump (freeware). Uma ferramenta que utilizo ao trabalhar com clientes para migrar fontes de dados BDE para bancos de dados InterBase.
Existem muitos recursos disponíveis para equipes que procuram migrar de tecnologias mais antigas, verifique o Embarcadero Upgrade and Migration Center hoje para ver o quão fácil pode ser a mudança para modernizar e atualizar seus aplicativos Delphi e C ++ Builder legados.
Fri Nov 20 2020 21:36:25 GMT+0700 (Western Indonesia Time)
С момента выпуска Delphi и C ++ Builder 10.4 мы создали больше способов для разработчиков, позволяющих легко переносить и обновлять свои существующие устаревшие приложения с Borland Delphi и C ++ Builder на новые модернизированные версии. Хотя есть много причин, по которым следует перейти на более новую версию, иногда это не кажется наиболее осуществимой идеей. Это может быть непростой задачей, если вы думаете о переносе данных с платформы, которая проработала столько лет, или уровня доступа к данным, о котором вам не нужно было беспокоиться.
Во многих приложениях Borland было обычным делом использовать BDE в качестве уровня доступа к данным для приложений Delphi и C ++ Builder, но со временем BDE остался в прошлом. Новые технологии пополнили ряды и превзошли возможности 32-битного BDE, который нам всем нравился.
Первым шагом к удалению BDE из вашего приложения является определение компонентов доступа к данным, которыми вы хотите его заменить. Есть несколько вариантов, которые вы можете использовать, включая UniDAC и IBeXpress. В этой статье я буду использовать FireDAC, набор компонентов доступа к данным, включенный в редакции RAD Studio, Delphi и C ++ Builder Enterprise и Architect. Для получения дополнительной информации о FireDAC ознакомьтесь с FireDAC Docwiki.
Переход с BDE на FireDAC
Изменение фреймворков, которые вы используете для доступа к своим данным, с годами стало проще. Теперь у нас есть такие инструменты, как reFind (специфичный для Delphi) для BDE и DBExpress, инструмент миграции Delphi Parser из BDE в FireDAC для C ++ Builder и Delphi, а также многие другие инструменты, доступные для миграции. Посмотрите это видео ниже, где мы покажем вам, как использовать инструмент reFind для перехода от компонентов BDE в форме к FireDAC.
Источники данных BDE для InterBase
После переноса компонентов в приложение в некоторых случаях можно остаться с имеющейся базой данных. Хотя FireDAC поддерживает Paradox и другие настольные базы данных через ODBC, он содержит несколько драйверов, которые позволяют подключаться к большому количеству баз данных, таких как Oracle, DB2, MySQL, MSSQL, InterBase / Firebird и т. Д.
Хотя вы можете использовать функции импорта и экспорта данных InterBase в сочетании с инструментом проектирования базы данных, который реверсирует и пересылает инженеры вашей схемы базы данных, существуют доступные инструменты, которые помогают уменьшить хлопоты в этом процессе. Одним из таких инструментов является InterBase Datapump (бесплатное ПО). Инструмент, который я использую при работе с клиентами для миграции источников данных BDE в базы данных InterBase.
Командам, желающим перейти на более старые технологии, доступно множество ресурсов. Посетите Центр обновления и миграции Embarcadero сегодня, чтобы увидеть, насколько простым может быть переход на модернизацию и обновление устаревших приложений Delphi и C ++ Builder.
Fri Nov 20 2020 21:36:24 GMT+0700 (Western Indonesia Time)
Desde el lanzamiento de Delphi y C ++ Builder 10.4, hemos creado más formas para que los desarrolladores migren y actualicen fácilmente sus aplicaciones heredadas existentes de Borland Delphi y C ++ Builder a nuevas versiones modernizadas. Si bien hay muchas razones por las que uno debería actualizar a la versión más reciente, a veces no parece la idea más factible. Puede ser una tarea abrumadora si considera migrar sus datos desde una plataforma que ha funcionado durante tantos años o una capa de acceso a datos de la que no ha tenido que preocuparse.
Con muchas aplicaciones de Borland, ha sido común tener el BDE como la capa de acceso a datos para las aplicaciones Delphi y C ++ Builder, pero con el tiempo, el BDE se ha quedado en el pasado. Las tecnologías más nuevas se han unido a las filas y han superado las capacidades del BDE de 32 bits que todos amamos.
El primer paso para eliminar el BDE de su aplicación es determinar los componentes de acceso a datos con los que desea reemplazarlo. Hay algunas opciones que puede usar, incluidas UniDAC e IBeXpress. En este artículo, usaré FireDAC, el conjunto de componentes de acceso a datos incluido en las ediciones RAD Studio, Delphi y C ++ Builder Enterprise y Architect. Para obtener más información sobre FireDAC, consulte FireDAC Docwiki.
Migración de BDE a FireDAC
Cambiar los marcos que usa para acceder a sus datos se ha vuelto más fácil a lo largo de los años. Ahora tenemos herramientas como reFind (específico de Delphi) para BDE y DBExpress, la herramienta de migración de BDE a FireDAC de Delphi Parser para C ++ Builder y Delphi, y muchas otras herramientas disponibles para migraciones. Vea este video a continuación, donde le mostramos cómo usar la herramienta reFind para migrar desde los componentes BDE en un formulario a FireDAC.
Fuentes de datos BDE a InterBase
Una vez que haya migrado sus componentes en su aplicación, en algunos casos, puede permanecer con la base de datos que tiene. Si bien FireDAC admite Paradox y otras bases de datos de escritorio a través de ODBC, contiene varios controladores que le permiten conectarse a una gran cantidad de bases de datos como Oracle, DB2, MySQL, MSSQL, InterBase / Firebird, etc.
Si bien puede utilizar las funciones de importación y exportación de datos de InterBase combinadas con una herramienta de diseño de base de datos que revierte y reenvía el esquema de su base de datos, existen herramientas disponibles que ayudan a reducir la molestia en este proceso. Una de estas herramientas es InterBase Datapump (software gratuito). Una herramienta que utilizo cuando trabajo con clientes para migrar fuentes de datos BDE a bases de datos de InterBase.
Hay muchos recursos disponibles para los equipos que buscan migrar fuera de tecnologías más antiguas, consulte el Centro de actualización y migración de Embarcadero hoy mismo para ver cuán fácil podría ser el movimiento para modernizar y actualizar sus aplicaciones heredadas de Delphi y C ++ Builder.
Fri Nov 20 2020 21:33:07 GMT+0700 (Western Indonesia Time)
Seit der Veröffentlichung von Delphi und C++Builder 10.4 haben wir mehr Möglichkeiten für Entwickler geschaffen, ihre vorhandenen Legacy-Anwendungen von Borland Delphi und C++Builder auf einfache Weise auf neue modernisierte Versionen zu migrieren und zu aktualisieren. Obwohl es viele Gründe gibt, warum man auf die neuere Version upgraden sollte, klingt es manchmal nicht nach der praktikabelsten Idee. Es kann eine entmutigende Aufgabe sein, wenn Sie erwägen, Ihre Daten von einer Plattform zu migrieren, die so viele Jahre lang funktioniert hat, oder von einer Datenzugriffsschicht, um die Sie sich keine Sorgen machen mussten.
Bei vielen Borland-Anwendungen war es bisher üblich, die BDE als Datenzugriffsschicht für Delphi- und C++Builder-Anwendungen zu verwenden, aber im Laufe der Zeit ist die BDE in der Vergangenheit geblieben. Neuere Technologien sind hinzugekommen und haben die Fähigkeiten der 32-Bit-BDE, die wir alle geliebt haben, übertroffen.
Der erste Schritt zum Entfernen der BDE aus Ihrer Anwendung besteht darin, die Datenzugriffskomponenten zu bestimmen, durch die Sie die BDE ersetzen möchten. Es gibt ein paar Optionen, die Sie verwenden können, darunter UniDAC und IBeXpress. In diesem Artikel werde ich FireDAC verwenden, den Datenzugriffskomponentensatz, der in den Editionen RAD Studio, Delphi und C++Builder Enterprise und Architect enthalten ist. Weitere Informationen zu FireDAC finden Sie im FireDAC Docwiki.
BDE zu FireDAC-Migration
Das Ändern der Rahmenbedingungen, die Sie für den Zugriff auf Ihre Daten verwenden, ist im Laufe der Jahre einfacher geworden. Jetzt haben wir Werkzeuge wie reFind (Delphi-spezifisch) für BDE und DBExpress, Delphi Parser’s BDE zu FireDAC Migrationswerkzeug für C++Builder und Delphi, und viele andere Werkzeuge für Migrationen verfügbar. Sehen Sie sich dieses Video unten an, in dem wir Ihnen zeigen, wie Sie das reFind-Tool verwenden, um von den BDE-Komponenten auf einem Formular nach FireDAC zu migrieren.
BDE-Datenquellen zu InterBase
Nachdem Sie Ihre Komponenten in Ihrer Anwendung migriert haben, können Sie in einigen Fällen bei der vorhandenen Datenbank bleiben. Obwohl FireDAC Paradox und andere Desktop-Datenbanken über ODBC unterstützt, enthält es mehrere Treiber, die es Ihnen ermöglichen, eine Verbindung zu einer großen Anzahl von Datenbanken wie Oracle, DB2, MySQL, MSSQL, InterBase/Firebird usw. herzustellen.
Während Sie die InterBase-Funktionen zum Importieren und Exportieren von Daten in Kombination mit einem Datenbank-Design-Tool verwenden können, das Ihr Datenbankschema rückwärts und vorwärts entwirft, gibt es Tools, die Ihnen helfen, den Aufwand in diesem Prozess zu verringern. Eines dieser Tools ist das InterBase Datapump (Freeware). Ein Tool, das ich bei der Arbeit mit Kunden verwende, um BDE-Datenquellen in InterBase-Datenbanken zu migrieren.
Für Teams, die von älteren Technologien migrieren möchten, stehen zahlreiche Ressourcen zur Verfügung. Informieren Sie sich noch heute im Embarcadero Upgrade and Migration Center, wie einfach die Modernisierung und Aktualisierung Ihrer älteren Delphi- und C++Builder-Anwendungen sein könnte.
В течение последних лет компания Embarcadero обновляет версии своих инструментов для разработчиков довольно регулярно: 2 раза в год, как минимум. С помощью продляемой подписки на обновления наши пользователи сразу получают самые последние релизы своих продуктов, одновременно продолжая свои проекты на той же или даже более старой версии. Но рано или поздно наступает момент, когда для реализации новых задумок или требований пользователей имеющихся возможностей инструментов уже не хватает. В этот момент очень важно иметь дополнительные ориентиры для оптимального планирования этих проектов как по времени, так и по инструментам их реализации.
Понимая необходимость этого, наша компания регулярно информирует о планах по развитию наших инструментов и публикует «дорожную карту» их развития. Создание такой карты довольно сложное дело, так как требуется учесть интересы и запросы большинства наших пользователей по всему миру, многие из которых являются крупными компаниями с налаженным и успешным бизнесом, и верно расставить приоритеты по различным средствам и регионам. Хотя такие карты являются протоколами о намерении, они все же очень важны для планирования, особенно для нашей страны с долгим циклом финансирования.
Полезной традицией стали личные комментарии к опубликованным планам менеджеров по продуктам — Марко Канту, Дэвида Миллингтона и Сарины Дюпон. https://blogs.embarcadero.com/rad-studio-november-2020-roadmap-pm-commentary/ Наряду с официальными слайдами дорожной карты, они представляют больше подробностей, информации и понимания в этом дополнительном посте блога.
Ниже мне хотелось бы привести главное из высказанного ими.
Что доступно на данный момент
В начале этого года мы выпустили Сидней 10.4. Релиз 10.4 был очень хорошо принят нашими клиентами и включал в себя первую поставку созданного заново движка Delphi Code Insight, теперь основанного на архитектуре протокола Language Server (LSP), нового отладчика для C++ Win64, с медленным откликом на действия клиента, и новые возможности языка Delphi, такие как пользовательские управляемые записи. Мы также значительно расширили возможности использования VCL-стилей с поддержкой HighDPI-мониторов и стилизации под управление.
В продолжение релиза 10.4 в в сентябре 2020 года мы выпустили версию 10.4.1, которая была в основном сфокусирована на качестве и дальнейшем улучшении функций, поставляемых в 10.4, в частности, на недавно добавленной поддержке Delphi LSP. 10.4.1 включает более 800 улучшений качества, в том числе более 500 улучшений качества для публичных выпусков на портале качества Embarcadero.
Прежде чем перейти к подробностям о релизах 10.4.2 и 10.5, мы хотели бы подчеркнуть, что 10.4/10.4.1 был одним из самых популярных наших релизов на сегодняшний день, с большим количеством скачиваний по сравнению с 10.3 и 10.2. Это особенно впечатляет в разгар КОВИД-19. В настоящее время мы работаем над релизом 10.4.2, запланированным на первую половину 2021 календарного года и подробно описанным в дорожной карте. За некоторое время до релиза мы собираемся пригласить клиентов RAD Studio, Delphi и C++Builder, имеющих активную подписку на обновления, присоединиться к бета-тестированию предстоящего релиза. Возможность присоединиться к бета-тестированию и быстрой обратной связи с разработчиками продукта на ранней стадии цикла разработки является одним из преимуществ подписки на обновления.
Разбор кода
В 10.4.2, одним из важных направлений работы является новая версия Delphi Code Insight (он же Delphi LSP). В 10.4.2 будет включено не только множество исправлений и тонкостей, но и менее распространенные функции понимания кода, которые мы не включали в первоначальную версию, а также некоторые новые или значительно улучшенные функции Code Completion. Например, мы планируем добавить, в том числе, ctrl-клик на ‘унаследованное’, а также переработанное завершение в пунктах ‘Uses’.
Наиболее заметным для всех клиентов C++ будет полная ревизия Code completion C++ кода при использовании компиляторов Clang. В 10.3, когда мы перешли на C++17, нам пришлось заменить технологию завершения кода, используемую IDE. Для версии 10.4.2 мы решили провести полный капитальный ремонт Code Completion на С++, чтобы обеспечить необходимую производительность разработчику. Клиенты на С++ должны понимать, что доработка кода и навигация по нему работают надежно и хорошо. Мы даже рассматривали некоторые более сложные случаи, например, обеспечение доработки в заголовочном файле (гораздо сложнее, чем в .cpp-файле)! Конечным результатом должно быть все, о чем вы нас просили.
Обработка исключений C++
Обработка исключений — это сложная область, требующая тесного взаимодействия между компилятором и RTL для корректной работы. Существуют общие конвенции для исключений, такие как никогда не допускать пересечение границы модуля (например, быть поднятым в DLL, но попавшим в EXE), но они не всегда выполняются, иногда по уважительным причинам. В Си++ нам нужно работать с исключениями на Си++, исключениями из ОС и SEH, не забывая при этом и об обработке исключений в Delphi.
В 10.4.2 мы переработали систему обработки исключений. По мере приближения к релизу мы выпустим в блоге подробное описание сценариев, которые мы поддерживаем. Уже сейчас видны некоторые отличные улучшения!
IDE и инструментарий
10.4.2 запланирована работа по улучшению IDE
В этом релизе мы добавляем третий стиль, который использует традиционный серый, а не синий для основных цветов. Это может быть полезно для тех, кому требуются особые условия по зрению.
Мы также планируем дальнейшее улучшение настольных шаблонов, мульти-мониторных шаблонов, редакторов форм и аналогичных областей. Это включает в себя возможность работы в дизайнере формы одновременно с открытым редактором кода для этой формы
Наконец, мы хотим усовершенствовать инструмент миграции Settings Migration Tool, чтобы помочь перенести настройки RAD Studio из версии в версию (например, из 10.3 в 10.4) и лучше сохранить вашу конфигурацию при переходе к выпуску обновления (например, из 10.4.1 в 10.4.2). Мы планируем добавлять конкретные предустановленные конфигурации для каждого сценария и включать конфигурационные файлы в дополнение к настройкам реестра, рассматриваемым сегодня.
Поддерживаемые платформы
Что касается целевых операционных систем, то в настоящее время мы сосредоточены на совершенствовании существующих платформ, поддерживаемых в 10.4.x, и есть два направления, над которыми мы работаем в 10.4.2.
Первое — это часть нашего постоянного внимания к Windows как нашей основной целевой ОС. В операционной системе Microsoft мы внимательно следим за текущим направлением деятельности Microsoft по объединению WinRT API и традиционного Win API, через Project Reunion. Project Reunion (https://github.com/microsoft/ProjectReunion) включает в себя различные технологии, начальными из которых являются WinUI 3, WebView2 и MSIX.
Элемент управления WebView2 — это новый Windows-платформенный компонент, встраивающий Edge Chromium. Мы предоставили поддержку этой функции в 10.4 с VCL компонентом TEdgeBrowser.
Еще одной частью релиза будет поддержка MSIX-формата упаковки, который мы планируем включить в 10.4.2. MSIX является преемником APPX, цели, которую мы в настоящее время предлагаем в рамках интеграции RAD Studio IDE Desktop Bridge, и предназначен для Microsoft Store и для развертывания на предприятии.
Мы работаем над новыми VCL Native Windows Controls, чтобы вы могли предоставить своим клиентам более современный пользовательский интерфейс:
Один из них — оптимизированный виртуальный список, который позволит вам отображать большое количество элементов с гибкой комбинацией текста и графики. Управление будет свободно основываться на подходе существующего управления DBCtrlGrid, но без необходимости использования источника данных. Он будет поддерживать использование Live Bindings.
Другой новый компонент VCL, который мы добавляем, это контрол цифрового ввода, аналогичный контролу NumberBox платформы WinUI. Этот элемент управления обеспечивает более легкий и плавный цифровой ввод, учитывая различные форматы (целые числа, числа с плавающей точкой, валютные значения), а также включая простую оценку выражений.
Совместимость с новыми версиями операционных систем
Мы планируем обеспечить полную совместимость с новыми версиями операционных систем, выпущенными Apple и Google после выхода RAD Studio 10.4.1. Несмотря на то, что сегодня можно ориентироваться на эти платформы, есть несколько открытых проблем, которые мы хотим решить должным образом (а не через обходные пути). Цель состоит в том, чтобы иметь полную поддержку:
iOS 14 и iPadOS 14 (Delphi и C++).
macOS 11.0 Big Sur (Intel) (Delphi)
Android 11 (Delphi)
Работа над повышением качества
Что касается качества, то в 10.4.2 (как и в 10.4.1) мы продолжим прилагать значительные усилия по обеспечению стабильности, производительности и качества. Мы планируем решение проблем, о которых сообщали клиенты, и эскалацию поддержки во многих областях продукта. Инструменты и библиотеки, на которых мы особенно сосредоточимся, в дополнение к тем, которые были перечислены ранее, включают в себя:
Компилятор Delphi (для всех платформ) для повышения его надежности и обратной совместимости, но особое и глубокое внимание уделяется производительности компилятора (и компоновщика) для сокращения времени компиляции больших проектов, а также ускорению LSP-движка (который использует компилятор для анализа исходного кода).
Библиотека клиента SOAP вместе с инструментом импорта WSDL, который генерирует клиентский код, используемый для интерфейса с серверами SOAP.
Библиотека параллельного программирования (PPL), которая предлагает отличную абстракцию различных платформ и многоядерных потоковых возможностей CPU, с точки зрения задач, фьючерсов и параллельных циклов
Многоуровневые решения для веб-сервисов, входящие в состав RAD Studio, с усовершенствованиями как RAD Server, так и старого движка DataSnap, а также общими усовершенствованиями клиентских библиотек HTTP и REST. Мы также продолжим фокусироваться на поддержке Azure и AWS Cloud.
Дополнительное внимание будет уделено VCL-стилям и HighDPI-стилям, а также VCL в целом.
Для библиотеки FireMonkey мы продолжаем улучшать компоненты TMemo (как в платформе, так и в стилевых версиях), драйвер библиотеки Metal GPU, представленный в 10.4, и переделывать управление датчиками на Android, чтобы обеспечить лучшую поддержку для различных Android-устройств.
Планируемое по 10.5
Для 10.5 запланирована реализация замечательных новых функций, которые с нетерпением ожидают многие клиенты.
В течение создания 10.5 мы планируем внедрить новую целевую платформу для Delphi — macOS ARM (на базе процессоров Apple Silicon), значительную работу по поддержке IDE HighDPI, расширения инструментальной цепочки C++, а также многие другие дополнительные функции и улучшения качества
Что касается платформы Windows, то, как уже упоминалось ранее, мы планируем предложить поддержку различных технологий, входящих в состав Microsoft Project Reunion. В частности, в релизе RAD Studio 10.5 мы планируем интегрировать поддержку современных Windows UX через библиотеку WinUI 3. Согласно дорожной карте Microsoft для библиотеки, должна появиться возможность использовать компоненты этой библиотеки в нативном приложении, основанном на классическом API, смешивая формы и элементы управления различных типов. Реальные детали будут зависеть от того, что библиотека будет предоставлять в плане интеграции с нативными приложениями, но наш текущий план состоит в том, чтобы интегрировать эту библиотеку в VCL с новыми специфическими элементами управления.
Говоря о платформах, мы хотим добавить новую ОС для приложений Delphi: новый компилятор для ARM-версии операционной системы macOS с аппаратным обеспечением Apple на базе процессоров Apple Silicon. Несмотря на то, что вы можете запускать приложения Intel, цель состоит в том, чтобы иметь родное приложение ARM для нового поколения Mac. Это будет значительное расширение Delphi, включая новый компилятор, обновления библиотеки времени исполнения и различные библиотеки высокого уровня. Мы также планируем расширить синтаксис языка Delphi.
Планируется полная поддержка HighDPI в IDE. Уже в паре релизов VCL поддерживает HighDPI, теперь будет поддерживать HighDPI и IDE RAD Studio, которая в основном использует VCL. Это гарантирует четкую визуализацию на всех современных экранах с высоким разрешением, в том числе при перемещении окон по экранам с различными разрешениями и масштабами.
Дизайнер форм VCL является одним из ключевых инструментов, который вы используете при создании приложения. Смысл дизайнера заключается в том, чтобы быстро построить интерфейс, приближенный к тому, как он будет выглядеть при работе приложения, в отличие от инструментов, которые описывают интерфейс только в тексте и не обеспечивают немедленной обратной связи / цикла итераций. В 10.5, мы планируем расширить этот элемент, чтобы проект выглядел похожим на то, как будет выглядеть ваше приложение при работе, добавив поддержку VCL-стиля в конструктор, так что когда любой из ваших элементов управления будет стилизован, вы увидите, что они также стилизованы и в конструкторе.
Дизайнер форм FMX также является ключевым инструментом, когда вы строите кроссплатформенное приложение. Мы планируем внести некоторые инструменты проектирования из дизайнера VCL, такие как руководства по выравниванию, чтобы убедиться, что дизайнер имеет функции производительности, которые вам нужны.
Мы также планируем сконцентрироваться на интеграции IDE с системами управления исходными кодами, чтобы облегчить коллективную работу вашей команде разработчиков. Кроме того, мы планируем некоторые улучшения в том, как IDE будет представлена при первом запуске, чтобы помочь новичкам в Delphi и C++Builder начать работу.
Наконец, многие клиенты используют Delphi или C++Builder на выделенном сборочном сервере. Наряду с управлением исходными кодами, тестированием и подобной практикой, хорошей практикой является официальная сборка на конкретной машине или виртуальной машине. В настоящее время для установки RAD для сборочного сервера необходимо установить полную IDE — но это не должно требоваться, так как для сборки нужны только инструменты командной строки. Мы планируем сценарий установки специально для сборочных серверов.
C++Builder
В 10.5 мы планируем полную замену другому базовому инструменту — компоновщику. Как и отладчик, это будет для Win64.
Вы заметите ориентацию на 64-битную Windows в C++Builder. Многие клиенты используют Clang для работы с Win64, и мы хотим, чтобы наши инструменты были на уровне или лучше, чем та, к которой вы можете привыкнуть из классического компилятора. Кроме того, многие начинают смотреть исключительно на 64-битные приложения, при этом 32-битные приложения обновляются, а новые — только на 64-битные.
Visual Assist — удивительное расширение производительности для Visual C++, дающее завершение кода, рефакторинг и многое другое. Мы исследовали различные способы его интеграции в C++Builder и планируем сделать это в 10.5.
Наконец, мы также планируем улучшить взаимодействие с Delphi/C++. Возможность использования двух языков — это большой прирост производительности и одна из ключевых причин использования C++Builder или RAD Studio. Планируется дополнительная работа для оттачивания этой интеграции. Это должно обеспечить более плавную интеграцию с функциями RTL.
Delphi отладчик
В 10.4 мы представили совершенно новый отладчик для C++ Win64, основанный на LLDB. В конечном итоге, мы стремимся использовать один и тот же отладчик на всех платформах — сегодня мы используем смесь различных отладчиков. Ключом к этому является добавление к LLDB фронтенда языка Delphi, который позволяет оценить синтаксис Delphi, например, в диалоге Evaluate/Modify. Мы планируем представить первую платформу, использующую LLDB, с этим новым фронтендом в 10.5.
Резюме
У нас большие планы на ближайшие релизы Delphi, C++Builder и RAD Studio! Мы будем активно работать, чтобы сделать задуманное доступным пользователям!
Wed Nov 18 2020 22:14:41 GMT+0700 (Western Indonesia Time)
Quad Engine ist eine Open-Source-DirectX-Spiele-Engine, die in Delphi entwickelt wurde und auch Bindungen für C++ und C# bietet. Blast-off ist ein Vorzeige-Spiel, das in die Quad-Engine eingebaut und auf Stream verfügbar ist. Es wird beschrieben als „Blast-off ist ein Hardcore-Jumper/Läufer/Shmup, bei dem Ihr Alter Ego ein Ball aus Antimaterie sein wird, der unser Universum verlassen will. Antimaterie ist in unserem Universum äußerst schwierig zu existieren, denn wenn sie mit Materie in Berührung kommt, vernichtet sie diese. Dies zwingt den Helden, superschnelle Geschwindigkeit zu erreichen, um die Raumzeit zu durchbrechen und die Grenze zu durchbrechen, wo er Frieden in der Leere finden wird„. Die Spielengine selbst verfügt über 10 verschiedene Demos, die zeigen, wie verschiedene Funktionen der Engine genutzt werden können. Zusätzlich gibt es einen Showcase-Abschnitt mit 12 verschiedenen Spielen plus vollständigem Quellcode, der mit der Quad-Engine erstellt wurde. Eine ziemlich beeindruckende technische Meisterleistung in einem kleinen Paket.
Wed Nov 18 2020 22:14:22 GMT+0700 (Western Indonesia Time)
Quad Engine es un motor de juegos DirectX de código abierto construido en Delphi que también ofrece enlaces para C ++ y C #. Blast-off es un juego de exhibición creado en Quad Engine y disponible en Stream. Se describe como “Blast-off es un saltador / corredor / shmup incondicional, donde tu alter ego será una bola de antimateria que busca dejar nuestro Universo. La antimateria es extremadamente difícil de existir en nuestro universo, porque cuando el contacto con la materia lo aniquila. Esto obliga al héroe a alcanzar una velocidad súper rápida para romper el espacio-tiempo y romper el límite, donde encontrará la paz en el vacío “. El motor del juego en sí tiene 10 demostraciones diferentes que muestran cómo usar varias funciones en el motor. Además, hay una sección de exhibición con 12 juegos diferentes más el código fuente completo creado con el motor quad. Una hazaña de ingeniería bastante impresionante en un paquete pequeño.
Wed Nov 18 2020 22:13:45 GMT+0700 (Western Indonesia Time)
Quad Engine é um mecanismo de jogo DirectX de código aberto construído em Delphi, que também oferece ligações para C ++ e C #. Blast-off é um jogo de demonstração construído no motor quádruplo e disponível no Stream. É descrito como “Blast-off é um saltador / runner / shmup hardcore, onde seu alter ego será uma bola de anti-matéria procurando deixar nosso Universo. A anti-matéria é extremamente difícil de existir em nosso universo, porque quando ela o contato com a matéria é aniquilado. Isso força o herói a atingir velocidade super-rápida para romper o espaço-tempo e romper o limite, onde encontrará paz no vazio. ” O motor de jogo em si tem 10 demos diferentes mostrando como usar vários recursos do motor. Além disso, há uma seção de demonstração com 12 jogos diferentes, além do código-fonte completo construído com o motor quad. Um feito impressionante de engenharia em um pacote pequeno.
Wed Nov 18 2020 22:13:17 GMT+0700 (Western Indonesia Time)
Quad Engine — это игровой движок DirectX с открытым исходным кодом, построенный на Delphi, который также предлагает привязки для C ++ и C #. Blast-off — это демонстрационная игра, созданная на движке Quad Engine и доступная на Stream. Он описывается как «Взрыв — это хардкорный прыгун / бегун / шмап, где ваше альтер-эго будет шаром антиматерии, стремящимся покинуть нашу Вселенную. Антивещество чрезвычайно трудно существовать в нашей Вселенной, потому что когда оно контакт с материей он уничтожает. Это заставляет героя достичь сверхбыстрой скорости, чтобы прорваться сквозь пространство-время и преодолеть предел, где он обретет покой в пустоте ». Сам игровой движок содержит 10 различных демонстраций, показывающих, как использовать различные функции движка. Кроме того, есть демонстрационный раздел с 12 различными играми и полным исходным кодом, созданным с помощью quad Engine. Впечатляющее достижение инженерной мысли в небольшом корпусе.
#ifdef _WIN32
#include
#else
typedef char _TCHAR;
#define _tmain main
#endif
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[]) {
string hello = "C++";
string world = "17";
auto add_things = [](auto a, auto b) { return a + b; };
auto i = add_things(1, 2);
auto s = add_things(hello, world);
cout << i << endl;
cout << s << endl;
cout << [](auto a, auto b){ return a + b; }(2, 2) << 'n';
system("pause");
return 0;
}
上記のコードのうち、次の行に注目してください。
auto add_things = [](auto a, auto b) { return a + b; };
Tue Nov 17 2020 22:56:31 GMT+0700 (Western Indonesia Time)
Марко Канту, Дэвид Миллингтон и Сарина Дюпон
Введение
Команда управления продуктами Embarcadero RAD Studio регулярно обновляет план разработки продуктов для Delphi, C ++ Builder и RAD Studio. Как вы можете видеть в нашем блоге с официальной дорожной картой, мы только что выпустили новую версию дорожной карты, охватывающую ключевые функции, которые мы запланировали на следующие 12 месяцев. Наряду с официальными слайдами дорожной карты мы хотели предложить более подробную информацию, информацию и понимание в этом дополнительном сообщении в блоге. Возможно, вам будет полезно открыть слайды для справки при чтении расширенной информации, которую мы предоставляем здесь.
В нашей дорожной карте вы можете найти ключевые функции, которые мы запланировали на 2021 календарный год. Прежде чем мы перейдем к деталям нашей обновленной дорожной карты, мы хотим подвести итоги того, что мы сделали на данный момент.
В начале этого года мы выпустили 10.4 Sydney. Релиз 10.4 был очень хорошо принят нашими клиентами и включал в себя первую поставку нашего полного переписанного механизма Delphi Code Insight, теперь основанного на архитектуре протокола Language Server, нового отладчика для C ++ Win64, который отвечал на очень давний запрос клиентов. и новые функции языка Delphi, такие как настраиваемые управляемые записи. Мы также значительно расширили возможности использования стилей VCL с поддержкой мониторов HighDPI и стилями для каждого элемента управления.
Мы продолжили выпуск 10.4 Sydney с выпуском 10.4.1 в сентябре 2020 года, который был в первую очередь ориентирован на качество и дальнейшие улучшения функций, представленных в 10.4, в частности, недавно добавленную поддержку Delphi LSP. 10.4.1 включает более 800 улучшений качества, в том числе более 500 улучшений качества для публично зарегистрированных проблем на портале качества Embarcadero.
Прежде чем мы углубимся в подробности выпусков 10.4.2 и 10.5, мы хотели подчеркнуть, что 10.4 / 10.4.1 был одним из наших самых популярных выпусков на сегодняшний день, с большим количеством загрузок по сравнению с 10.3 и 10.2. Это особенно впечатляет в разгар COVID-19. Мы связываем успех как с выпуском, так и с нашим более активным взаимодействием с технологическими партнерами, которые продолжают сотрудничать с нашей командой для обновления и разработки новых функций. Мы также хотим поблагодарить вас, наших клиентов, за отличную обратную связь, которую вы предоставили команде продукта, с точки зрения функций, которые вы хотели бы добавить, и областей, на которых мы хотели бы сосредоточить внимание для качества, а также ваше участие. в наших бета-программах (что является одним из преимуществ подписки).
В настоящее время мы работаем над выпуском 10.4.2, который запланирован на первую половину календарного 2021 года и подробно описан в дорожной карте и в этом комментарии в блоге. За некоторое время до выпуска мы планируем пригласить клиентов RAD Studio, Delphi и C ++ Builder с активной подпиской на обновления для участия в бета-тестировании предстоящего выпуска. Бета-версия 10.4.2 будет бета-версией NDA, требующей от участников подписать наше соглашение о неразглашении перед тем, как принять участие в бета-тестировании. Возможность присоединиться к бета-версиям и участвовать в предоставлении обратной связи руководству продукта на ранних этапах цикла разработки — одно из преимуществ актуальности подписки на обновления.
В версии 10.5 мы планируем представить новую целевую платформу для Delphi, macOS ARM (на базе процессоров Apple Silicon), значительный объем работ по поддержке IDE HighDPI, расширения набора инструментов C ++ и многие другие дополнительные функции и улучшения качества. Подробности смотрите ниже.
График разработки плана развития RAD Studio
Прежде чем мы перейдем к деталям функций, над которыми команда разработчиков работает сегодня или изучает будущее, давайте взглянем на график следующих выпусков, как показано на основном слайде дорожной карты:
Комментарий Дэвида к планам 10.4.2
Анализ кода Delphi
Как писал Марко выше, в 10.4.1 мы уделяли большое внимание качеству. Это продолжается в 10.4.2, при этом одной из важных областей работы является новый Delphi Code Insight (он же Delphi LSP). Не только 10.4.2 будет включать в себя множество исправлений и настроек, а также менее часто используемые функции анализа кода, которые мы не использовали. включить в первоначальную версию, но также некоторые новые или значительно улучшенные функции автозавершения кода. Например, мы планируем добавить «унаследованный» с нажатой клавишей Ctrl, а также переработанное завершение в предложениях «использует» среди прочего.
C ++ Code Insight
C ++ также продолжает тему непрерывной качественной работы с акцентом на две области.
Наиболее заметным для всех пользователей C ++ будет полная версия автозавершения кода C ++ при использовании компиляторов Clang. В версии 10.3, когда мы обновились до C ++ 17, нам пришлось заменить технологию завершения кода, которую использовала IDE. С момента его появления мы улучшали автозавершение кода в каждом выпуске, обращаясь к случаям использования, когда определенные шаблоны кода или настройки проекта могли вызвать проблемы с завершением.
В версии 10.4.2 мы решили провести полную переработку автозавершения кода для C ++, чтобы обеспечить необходимую продуктивность разработчика. Пользователи C ++ должны убедиться, что автозавершение кода и навигация работают надежно и хорошо.
Мы даже занимались некоторыми более сложными случаями, такими как обеспечение завершения в файле заголовка (намного сложнее, чем в файле .cpp)! Конечным результатом должно быть все, о чем вы нас просили.
Качество C ++ и обработка исключений
Другой важный аспект качества C ++ в 10.4.2 — обработка исключений.
Обработка исключений — сложная область, требующая тесного взаимодействия между компилятором и RTL для правильной работы. Существуют общие соглашения об исключениях, такие как недопущение того, чтобы исключение могло пересекать границу модуля (например, быть брошенным в DLL, но пойманным в EXE), но они не всегда соблюдаются, иногда по уважительным причинам. В C ++ нам нужно обрабатывать исключения C ++, исключения ОС и SEH, не забывая также об обработке исключений Delphi.
В 10.4.2 мы пересмотрели систему обработки исключений. По мере того, как мы приближаемся к выпуску, ждите сообщения в блоге, в котором подробно описаны поддерживаемые нами сценарии. Внутри мы сейчас наблюдаем отличные улучшения!
IDE
Помимо акцента на автозавершении кода для обоих языков, в среде IDE запланирована и другая работа в 10.4.2.
В 10.3 мы представили две текущие темы, светлый и темный стиль (на самом деле темный стиль, хотя и значительно отличающийся, был впервые представлен в 10.2.3. Это была одна из наших самых популярных функций.) Светлый стиль преимущественно бледно-синий. В этом выпуске мы добавляем третий стиль, в котором в качестве основных цветов используется традиционный серый, а не синий. Считайте это ретро-стилем для тех, кому нравится, как среда IDE выглядела в эпоху 2010-XE7, возврат к классическому виду. Мы также считаем, что это может быть полезно для тех, кому требуется особое зрение.
Мы также планируем дальнейшую качественную работу над макетами рабочего стола, макетами с несколькими мониторами, проектированием форм и аналогичными областями. Это включает в себя возможность создавать форму в конструкторе форм одновременно с открытием кода этой формы. Судя по отзывам, это была наиболее частая причина использования старого незакрепленного конструктора, который мы удалили в 10.4.1, и мы рады позволить вам кодировать и проектировать в модуле формы с использованием современного конструктора.
Наконец, мы хотим улучшить инструмент переноса настроек, чтобы помочь перенести настройки RAD Studio от версии к версии (например, с 10.3 на 10.4) и лучше сохранить вашу конфигурацию при переходе к выпуску обновления (например, с 10.4.1 на 10.4.2). ). Мы планируем добавить определенные предустановленные конфигурации для каждого сценария и включить файлы конфигурации в дополнение к параметрам реестра, которые рассматриваются сегодня.
Комментарий Марко к планам 10.4.2
Что касается целевых операционных систем , мы в настоящее время сосредоточены на улучшении существующих платформ, поддерживаемых в 10.4.x, и есть две основные области, над которыми мы работаем для 10.4.2.
Первый — это часть нашего постоянного внимания к Windows как к нашей основной цели. В операционной системе Microsoft мы внимательно следим за текущим направлением Microsoft по унификации WinRT API и традиционного Win API через Project Reunion. Project Reunion ( https://github.com/microsoft/ProjectReunion ) включает в себя различные технологии, первыми из которых являются WinUI 3, WebView2 и MSIX. Элемент управления WebView2 — это новый компонент платформы Windows, в который встроен Edge Chromium. Мы предоставили поддержку этой функции в 10.4 с компонентом TEdgeBrowser VCL.
Вторым строительным блоком будет поддержка формата упаковки MSIX, который мы планируем для 10.4.2. MSIX является преемником APPX, цели, которую мы в настоящее время предлагаем в рамках интеграции RAD Studio IDE Desktop Bridge, и предназначен для Microsoft Store и для корпоративного развертывания.
Еще одна область нашей улучшенной поддержки платформы Windows, в частности приложений VCL, — это добавление двух новых элементов управления, призванных помочь нашим клиентам модернизировать и улучшить UX своих приложений. Мы работаем над новыми встроенными элементами управления Windows VCL, чтобы вы могли предоставить своим клиентам более современный интерфейс:
Один из них — это высокооптимизированный виртуальный список, который позволит вам отображать большое количество элементов с гибким сочетанием текста и графики. Элемент управления будет основываться на подходе существующего элемента управления DBCtrlGrid, но без использования источника данных. Он будет поддерживать использование Live Bindings.
Другой новый компонент VCL, который мы добавляем, — это элемент управления числовым вводом, аналогичный элементу управления платформы WinUI NumberBox. Этот элемент управления обеспечивает более простой и плавный ввод числовых значений с учетом различных форматов (целые числа, числа с плавающей запятой, денежные значения), а также включает оценку простых выражений.
Вторая часть наших улучшений ориентирована на поддерживаемые в настоящее время целевые платформы. Мы планируем обеспечить полную совместимость с новыми версиями операционных систем, выпущенных Apple и Google после выхода RAD Studio 10.4.1. Хотя вы можете настроить таргетинг на эти платформы сегодня, есть несколько открытых проблем, которые мы хотим решить должным образом (а не с помощью обходных путей). Цель состоит в том, чтобы получить полную поддержку:
iOS 14 и iPadOS 14 (Delphi и C ++)
macOS 11.0 Big Sur (Intel) (Delphi)
Android 11 (Delphi)
Что касается качества , мы продолжим прилагать значительные усилия к стабильности, производительности и качеству в 10.4.2 (как мы это делали в 10.4.1). Мы планируем устранять проблемы, о которых сообщают клиенты, и расширять поддержку во многих областях продукта. Инструменты и библиотеки, на которых мы особенно сосредоточимся, в дополнение к перечисленным Дэвидом ранее, включают:
Компилятор Delphi (для всех платформ) для повышения его надежности и обратной совместимости, но особое внимание уделяется производительности компилятора (и компоновщика), чтобы сократить время компиляции для больших проектов, а также ускорить механизм LSP (который использует компилятор для проанализировать исходный код).
Клиентская библиотека SOAP вместе с инструментом импорта WSDL, который генерирует клиентский код, используемый для взаимодействия с серверами SOAP.
Библиотека параллельного программирования (PPL), которая предлагает отличную абстракцию различных платформ и возможностей многоядерных процессоров для многопоточности с точки зрения задач, будущего и параллельных циклов.
Решения многоуровневых веб-сервисов, входящие в состав RAD Studio, с улучшениями как для сервера RAD, так и для более старого механизма DataSnap, а также с общими улучшениями клиентских библиотек HTTP и REST. Мы также продолжим уделять особое внимание облачной поддержке Azure и AWS.
Стилям VCL и стилям HighDPI будет уделено дополнительное внимание, наряду с VCL в целом.
Для библиотеки FireMonkey мы продолжаем улучшать компоненты TMemo (как в платформенной, так и в стилизованной версиях), драйвер библиотеки Metal GPU, представленный в 10.4, и переделываем управление датчиками в Android, чтобы обеспечить лучшую поддержку для различных устройств Android.
RAD Studio 10.5
Для справки, вот снова основной слайд дорожной карты:
Комментарий Дэвида к планам версии 10.5
Пользовательский опыт
У нас есть ряд замечательных новых функций, которые с нетерпением ждут многие клиенты, запланированные на 10.5.
Во-первых, мы планируем полную поддержку высокого разрешения в среде IDE. VCL поддерживает высокий DPI уже в нескольких выпусках, а RAD Studio IDE, которая в основном использует VCL, теперь также будет поддерживать высокий DPI. Это гарантирует четкую визуализацию на всех современных экранах с высоким разрешением, в том числе при перемещении окон по экранам с разным разрешением и масштабом.
Конструктор форм VCL — один из ключевых инструментов, которые вы используете при создании своего приложения. Задача дизайнера состоит в том, чтобы быстро создать пользовательский интерфейс, близкий к тому, как он будет выглядеть при запуске вашего приложения, в отличие от инструментов пользовательского интерфейса, которые описывают пользовательский интерфейс только в тексте и не обеспечивают немедленной обратной связи / цикла итераций. В 10.5 мы планируем расширить этот элемент, чтобы он выглядел так, как ваше приложение будет выглядеть при запуске, добавив поддержку стиля VCL в конструктор, поэтому, когда любой из ваших элементов управления оформлен в стиле, вы также увидите его стили в дизайнере.
Конструктор форм FMX также является ключевым инструментом при создании кроссплатформенного приложения. Мы планируем использовать некоторые инструменты проектирования, которые есть у дизайнера VCL, такие как руководства по выравниванию, чтобы гарантировать, что у дизайнера есть необходимые вам функции производительности.
Мы также планируем сосредоточиться на интеграции системы управления версиями IDE, чтобы облегчить сотрудничество вашей команды. Кроме того, мы планируем некоторые улучшения представления среды IDE при первом запуске, чтобы помочь тем, кто плохо знаком с Delphi и C ++ Builder, приступить к работе.
Наконец, многие клиенты используют Delphi или C ++ Builder на выделенном сервере сборки. Наряду с контролем версий, тестированием и подобными практиками рекомендуется, чтобы официальные сборки выполнялись на определенной машине или виртуальной машине. В настоящее время для установки RAD для сервера сборки вам необходимо установить полную среду IDE, но этого не требуется, поскольку для сборки нужны только инструменты командной строки. Мы планируем сценарий установки специально для серверов сборки.
C ++ Builder
В 10.4.0 мы представили новый отладчик для C ++ Win64. Это было связано с распространенным запросом клиентов, особенно потому, что мы включили «средства форматирования», способ легко оценить содержимое контейнеров STL или любой структуры данных, включая вашу собственную. Это был совершенно новый отладчик, а не новая версия того, что мы использовали ранее. В версии 10.5 мы планируем аналогичную новую замену для другого основного инструмента — компоновщика. Как и отладчик, это будет для Win64.
Вы заметите здесь акцент на 64-битную Windows. Многие клиенты используют Clang для нацеливания на Win64, и мы хотим, чтобы наши инструменты были на уровне или лучше, чем инструменты, к которым вы, возможно, привыкли, из классического компилятора. Кроме того, многие люди начинают смотреть исключительно на 64-разрядные версии, причем 32-разрядные приложения обновляются, а новые приложения являются только 64-разрядными.
Visual Assist — это потрясающее расширение производительности для Visual C ++, обеспечивающее автозавершение кода, рефакторинг и многое другое. Мы изучаем различные способы интеграции его в C ++ Builder и планируем сделать это в версии 10.5.
Наконец, мы также планируем улучшить взаимодействие Delphi / C ++. Возможность использовать два языка — это большой рост производительности и одна из ключевых причин использовать C ++ Builder или RAD Studio, и это работа по совершенствованию этой интеграции. Это должно обеспечить более плавную интеграцию с функциями RTL.
Отладчик Delphi
В версии 10.4 мы представили совершенно новый отладчик для C ++ Win64 (отмеченный выше) на основе LLDB. В конечном итоге мы стремимся использовать один и тот же отладчик на всех платформах — сегодня мы используем сочетание разных отладчиков. Ключом к этому является добавление интерфейса языка Delphi к LLDB, который позволяет вам оценивать синтаксис Delphi, например, в диалоговом окне Evaluate / Modify. Мы планируем представить первую платформу, использующую LLDB, с этим новым интерфейсом в 10.5.
Комментарий Марко к планам 10.5
Платформы
Что касается платформы Windows, как упоминалось ранее, мы планируем предложить поддержку различных технологий, которые являются частью Microsoft Project Reunion. В частности, в выпуске RAD Studio 10.5 мы надеемся интегрировать поддержку современного Windows UX через библиотеку WinUI 3. Согласно дорожной карте Microsoft для библиотеки, должно появиться возможность использовать компоненты этой библиотеки в собственном приложении на основе классического API, смешивая формы и элементы управления разных типов. Фактические детали будут зависеть от того, что библиотека будет предоставлять с точки зрения интеграции с собственными приложениями, но наш текущий план состоит в том, чтобы интегрировать эту библиотеку в VCL с новыми конкретными элементами управления.
Говоря о платформах, мы хотим добавить новую цель для приложений Delphi: новый компилятор для ARM-версии операционной системы macOS с оборудованием Apple на базе процессоров Apple Silicon. Хотя вы можете запускать приложения Intel, цель состоит в том, чтобы иметь собственное приложение ARM для нового поколения компьютеров Mac.
Это будет существенное расширение Delphi, включая новый компилятор, обновления библиотеки времени выполнения и различных библиотек высокого уровня. Мы также планируем расширить синтаксис языка Delphi для всех платформ и повысить производительность кода математической обработки, генерируемого компилятором в Windows, что ускорит приложения при обработке чисел.
Мы также продолжим работать над общим качеством продукта и планируем выбрать несколько подсистем, на которых нужно сосредоточиться, решение, которое мы примем, оценив отзывы клиентов о текущем выпуске и будущих обновлениях.
Резюме
У нас большие планы на предстоящие выпуски Delphi, C ++ Builder и RAD Studio! От захватывающих изменений до автозавершения кода для обоих языков до IDE с высоким разрешением DPI, повышения производительности при кодировании и проектировании, пользовательского интерфейса Windows и новых компонентов VCL, отладки Delphi, поддержки Apple Silicon (M1) для Delphi, качественной работы для компиляторов, Delphi и C ++ RTL, SOAP, многоуровневый и многое другое, новый компоновщик для C ++ — предстоящие выпуски содержат некоторые действительно интересные работы. Нам не терпится доставить их вам!
Примечание. Эти планы и дорожная карта отражают наши намерения на эту дату, но наши планы развития и приоритеты могут быть изменены. Соответственно, мы не можем предложить никаких обязательств или других форм гарантий того, что мы в конечном итоге выпустим какой-либо или все описанные продукты в соответствии с графиком, описанным порядком или вообще. Эти общие указания графиков разработки или «дорожных карт продуктов» не следует интерпретировать или толковать как какие-либо обязательства, а права наших клиентов на обновления, обновления, улучшения и другие выпуски обслуживания будут изложены только в применимом лицензионном соглашении по программному обеспечению. .
Tue Nov 17 2020 22:12:59 GMT+0700 (Western Indonesia Time)
Der Entwickler Kiriakos Vlahos (alias PyScripter) verfügt über eine leistungsfähige native Windows-Python-IDE namens PyScripter, die er als Open-Source-Projekt erstellt hat. Sie ist in Delphi erstellt und nutzt alle Vorteile der in VCL eingebauten Styling-Fähigkeiten sowie robuste Delphi-Bibliotheken wie TSynEdit. Es unterstützt vollständig die neueste Version von Python und ist ein Langzeitprojekt, das über viele Jahre hinweg verfeinert und aktualisiert wurde. Laut Aussage des Entwicklers, der in einer kompilierten Sprache gebaut wird, ist es etwas flotter als einige der anderen Python-IDEs und bietet eine umfangreiche Mischung von Funktionen, die es zu einer produktiven Python-Entwicklungsumgebung machen. Sie bietet über 50 verschiedene Farbstile für die Benutzeroberfläche und zusätzlich 50 verschiedene Farbthemen für den Code-Editor. Außerdem ist die Schnittstelle in 15 verschiedenen Sprachen verfügbar.
Tue Nov 17 2020 22:12:40 GMT+0700 (Western Indonesia Time)
El desarrollador Kiriakos Vlahos (también conocido como PyScripter) tiene un poderoso IDE nativo de Windows Python llamado PyScripter que ha construido disponible como un proyecto de código abierto. Está integrado en Delphi y aprovecha al máximo las capacidades de estilo integradas en VCL más bibliotecas robustas de Delphi como TSynEdit. Es totalmente compatible con la última versión de Python y es un proyecto a largo plazo que se ha perfeccionado y actualizado durante muchos años. Según el desarrollador, la construcción en un lenguaje compilado lo hace bastante más ágil que algunos de los otros IDE de Python y proporciona una amplia combinación de características que lo convierten en un entorno de desarrollo de Python productivo. Ofrece más de 50 estilos de colores diferentes para la interfaz y 50 temas de colores diferentes adicionales para el editor de código. También ofrece la interfaz disponible en 15 idiomas diferentes.
Tue Nov 17 2020 22:12:09 GMT+0700 (Western Indonesia Time)
O desenvolvedor Kiriakos Vlahos (também conhecido como PyScripter) tem um poderoso IDE nativo do Windows Python chamado PyScripter que ele construiu disponível como um projeto de código aberto. Ele é construído em Delphi e aproveita todas as vantagens dos recursos de estilo incorporados ao VCL, além de bibliotecas Delphi robustas como o TSynEdit. Ele oferece suporte total à última versão do Python e é um projeto de longo prazo que foi refinado e atualizado ao longo de muitos anos. De acordo com o desenvolvedor, ser construído em uma linguagem compilada o torna mais rápido do que alguns dos outros IDEs do Python e fornece uma ampla combinação de recursos que o tornam um ambiente de desenvolvimento Python produtivo. Ele oferece mais de 50 estilos de cores diferentes para a interface e mais 50 temas de cores diferentes para o editor de código. Também oferece a interface disponível em 15 idiomas diferentes.
Tue Nov 17 2020 22:11:46 GMT+0700 (Western Indonesia Time)
Разработчик Кириакос Влахос (он же PyScripter) имеет мощную встроенную среду разработки для Windows Python под названием PyScripter, которую он построил в виде проекта с открытым исходным кодом. Он построен на Delphi и в полной мере использует возможности стилизации, встроенные в VCL, а также надежные библиотеки Delphi, такие как TSynEdit. Он полностью поддерживает последнюю версию Python и представляет собой долгосрочный проект, который дорабатывался и обновлялся в течение многих лет. По словам разработчика, создание скомпилированного языка делает его более быстрым, чем некоторые другие IDE Python, и предоставляет обширный набор функций, которые делают его продуктивной средой разработки Python. Он предлагает более 50 различных цветовых стилей для интерфейса и дополнительные 50 различных цветовых тем для редактора кода. Он также предлагает интерфейс, доступный на 15 различных языках.
Tue Nov 17 2020 20:21:33 GMT+0700 (Western Indonesia Time)
von Marco Cantu, David Millington und Sarina DuPont
Einführung
Das Embarcadero RAD Studio-Produktmanagementteam aktualisiert regelmäßig die Produktentwicklungs-Roadmap für Delphi, C ++ Builder und RAD Studio. Wie Sie in unserem offiziellen Roadmap-Blogbeitrag sehen können, haben wir gerade eine neue Version der Roadmap veröffentlicht, die die wichtigsten Funktionen abdeckt, die wir für die nächsten 12 Monate geplant haben. Zusammen mit den offiziellen Roadmap-Folien wollten wir mit diesem zusätzlichen Blog-Beitrag weitere Details, Informationen und Einblicke bieten. Es kann nützlich sein, die Folien als Referenz zu öffnen, während Sie die erweiterten Informationen lesen, die wir hier bereitstellen.
In unserer Roadmap finden Sie die wichtigsten Funktionen, die wir für das Kalenderjahr 2021 geplant haben. Bevor wir zu den Details unserer aktualisierten Roadmap gelangen, möchten wir noch einmal zusammenfassen, was wir bisher geliefert haben.
Anfang dieses Jahres haben wir 10.4 Sydney veröffentlicht. Die Version 10.4 wurde von unseren Kunden sehr gut angenommen und beinhaltete die erste Lieferung unserer vollständigen Neufassung der Delphi Code Insight-Engine, die jetzt auf der Language Server-Protokollarchitektur basiert, einem neuen Debugger für C ++ Win64, der eine sehr langjährige Kundenanfrage adressierte und neue Delphi-Sprachfunktionen wie benutzerdefinierte verwaltete Datensätze. Wir haben auch den Anwendungsfall von VCL-Stilen durch die Unterstützung von HighDPI-Monitoren und das Styling pro Steuerung erheblich erweitert.
Wir haben die Version 10.4 in Sydney mit 10.4.1 im September 2020 weiterverfolgt, die sich hauptsächlich auf die Qualität und weitere Verbesserungen der in 10.4 bereitgestellten Funktionen konzentrierte, insbesondere auf die neu hinzugefügte Delphi LSP-Unterstützung. 10.4.1 enthält über 800 Qualitätsverbesserungen, einschließlich mehr als 500 Qualitätsverbesserungen für öffentlich gemeldete Probleme im Embarcadero-Qualitätsportal.
Bevor wir uns mit den Versionen 10.4.2 und 10.5 befassen, wollten wir hervorheben, dass 10.4 / 10.4.1 eine unserer beliebtesten Veröffentlichungen ist und mehr Downloads als 10.3 und 10.2 bietet. Dies ist besonders beeindruckend inmitten von COVID-19. Wir führen den Erfolg sowohl auf die Veröffentlichung als auch auf unser verstärktes Engagement mit Technologiepartnern zurück, die weiterhin mit unserem Team zusammenarbeiten, um neue Funktionen zu aktualisieren und zu entwickeln. Wir möchten uns auch bei Ihnen, unseren Kunden, für das großartige Feedback bedanken, das Sie dem Produktteam gegeben haben, in Bezug auf Funktionen, die hinzugefügt werden sollen, und Bereiche, auf die wir uns hinsichtlich der Qualität konzentrieren sollen, und für Ihre Teilnahme in unseren Beta-Programmen (was einer der Vorteile eines Abonnements ist).
Derzeit arbeiten wir an der Version 10.4.2, die für den ersten Teil des Kalenderjahres 2021 geplant ist und in der Roadmap und in diesem Kommentar-Blogbeitrag beschrieben wird. Einige Zeit vor der Veröffentlichung erwarten wir, dass RAD Studio-, Delphi- und C ++ Builder-Kunden mit einem aktiven Update-Abonnement zum Betatest für die kommende Version eingeladen werden. Die Beta 10.4.2 ist eine NDA-Beta, bei der die Teilnehmer unsere Geheimhaltungsvereinbarung unterzeichnen müssen, bevor sie an der Beta teilnehmen können. Die Möglichkeit, Betas beizutreten und frühzeitig im Entwicklungszyklus Feedback zum Produktmanagement zu geben, ist einer der Vorteile der Aktualisierung des Update-Abonnements.
Für 10.5 planen wir die Einführung einer neuen Zielplattform für Delphi, macOS ARM (basierend auf Apple Silicon-CPUs), umfangreichen Arbeiten zur Unterstützung von IDE HighDPI, C ++ – Toolchain-Erweiterungen und vielen weiteren zusätzlichen Funktionen und Qualitätsverbesserungen. Siehe unten für weitere Details.
RAD Studio Roadmap Timeline
Bevor wir zu den Details der Funktionen kommen, an denen das Entwicklungsteam heute arbeitet oder für die Zukunft recherchiert, werfen wir einen Blick auf die Zeitleiste der kommenden Versionen, wie auf der Hauptfolie der Roadmap gezeigt:
Davids Kommentar zu 10.4.2 Plänen
Delphi Code Insight
Wie Marco oben schrieb, haben wir uns in 10.4.1 stark auf Qualität konzentriert. Dies wird in 10.4.2 fortgesetzt. Ein wichtiger Bereich ist das neue Delphi Code Insight (auch bekannt als Delphi LSP). 10.4.2 enthält nicht nur viele Korrekturen und Optimierungen sowie weniger häufig verwendete Code Insight-Funktionen, die wir nicht verwendet haben enthalten in der ersten Version aber auch einige neue oder deutlich verbesserte Funktionen bei der Code-Vervollständigung. Zum Beispiel planen wir, unter anderem bei gedrückter Strg-Taste auf „geerbt“ zu klicken und die Vervollständigung in den Verwendungsklauseln zu überarbeiten.
C ++ Code Insight
C ++ setzt auch das Thema der fortlaufenden Qualitätsarbeit fort, wobei der Schwerpunkt auf zwei Bereichen liegt.
Für alle C ++ – Kunden ist eine vollständige Überarbeitung der C ++ – Code-Vervollständigung bei Verwendung der Clang-Compiler am auffälligsten. In 10.3 mussten wir beim Upgrade auf C ++ 17 die von der IDE verwendete Code-Vervollständigungstechnologie ersetzen. Seit seiner Einführung haben wir die Code-Vervollständigung in jeder Version verbessert und Anwendungsfälle behandelt, bei denen bestimmte Codemuster oder Projekt-Setups Probleme bei der Vervollständigung verursachen können.
Für 10.4.2 haben wir uns entschlossen, die Code-Vervollständigung für C ++ vollständig zu überarbeiten, um die Entwicklerproduktivität zu gewährleisten, nach der Kunden suchen. C ++ – Kunden sollten feststellen, dass die Vervollständigung und Navigation von Code zuverlässig und gut funktioniert.
Wir haben sogar einige schwierigere Fälle angesprochen, z. B. die Vervollständigung in einer Header-Datei (viel schwieriger als in einer CPP-Datei)! Das Endergebnis sollte alles sein, wonach Sie uns gefragt haben.
C ++ – Qualitäts- und Ausnahmebehandlung
Der andere wichtige Qualitätsfokus für C ++ in 10.4.2 liegt auf der Ausnahmebehandlung.
Die Ausnahmebehandlung ist ein komplexer Bereich, der eine enge Zusammenarbeit zwischen dem Compiler und RTL erfordert, um ordnungsgemäß zu funktionieren. Es gibt übliche Konventionen für Ausnahmen, z. B. niemals zuzulassen, dass eine Ausnahme eine Modulgrenze überschreitet (z. B. in einer DLL ausgelöst, aber in einer EXE-Datei abgefangen), aber diese werden manchmal aus guten Gründen nicht immer befolgt. In C ++ müssen wir C ++ – Ausnahmen, Betriebssystemausnahmen und SEH behandeln, nicht zu vergessen auch die Ausnahmebehandlung von Delphi.
In 10.4.2 haben wir das Ausnahmebehandlungssystem überarbeitet. Wenn wir uns der Veröffentlichung nähern, freuen wir uns auf einen Blog-Beitrag, in dem die von uns unterstützten Szenarien aufgeführt sind. Intern sehen wir derzeit einige große Verbesserungen!
IDE
Neben dem Fokus auf die Code-Vervollständigung für beide Sprachen sind für die IDE weitere Arbeiten für 10.4.2 geplant.
In 10.3 haben wir die beiden aktuellen Themen eingeführt, einen hellen und einen dunklen Stil (tatsächlich wurde ein dunkler Stil, obwohl er sich erheblich unterscheidet, erstmals in 10.2.3 eingeführt. Dies war eine unserer beliebtesten Funktionen.) Der helle Stil ist überwiegend hellblau. In dieser Version fügen wir einen dritten Stil hinzu, bei dem für die Hauptfarben traditionelles Grau und nicht Blau verwendet wird. Betrachten Sie es als einen Retro-Stil für diejenigen, die es mögen, wie die IDE in der 2010-XE7-Ära aussah, ein Rückruf zum klassischen Look. Wir glauben auch, dass es für diejenigen nützlich sein kann, die spezielle Sehkraftanpassungen benötigen.
Wir planen auch weitere Qualitätsarbeiten in Bezug auf Desktop-Layouts, Layouts mit mehreren Monitoren, Formularentwurf und ähnliche Bereiche. Dazu gehört, dass Sie Ihr Formular im Formular-Designer gleichzeitig mit dem Öffnen des Codes für dieses Formular entwerfen können. Aufgrund von Rückmeldungen war dies der häufigste Grund für die Verwendung des alten, nicht angedockten Designers, den wir in 10.4.1 entfernt haben, und wir freuen uns, dass Sie mit dem modernen Designer sowohl Code als auch Design in einer Formeinheit erstellen können.
Schließlich möchten wir das Migrationstool für Einstellungen verbessern, um die RAD Studio-Einstellungen von Version zu Version (z. B. von 10.3 auf 10.4) zu verschieben und Ihre Konfiguration beim Wechsel zu einer Update-Version (z. B. von 10.4.1 auf 10.4.2) besser beizubehalten ). Wir planen, für jedes Szenario spezifische voreingestellte Konfigurationen hinzuzufügen und zusätzlich zu den heute berücksichtigten Registrierungseinstellungen Konfigurationsdateien aufzunehmen.
Marcos Kommentar zu 10.4.2 Plänen
In Bezug auf die Zielbetriebssysteme konzentrieren wir uns derzeit auf die Verbesserung der vorhandenen Plattformen, die in 10.4.x unterstützt werden, und es gibt zwei Schwerpunkte, an denen wir für 10.4.2 arbeiten.
Das erste ist Teil unseres kontinuierlichen Fokus auf Windows als unser Hauptziel. Auf dem Microsoft-Betriebssystem folgen wir genau der aktuellen Microsoft-Anweisung zur Vereinheitlichung der WinRT-API und der traditionellen Win-API über Project Reunion. Project Reunion (https://github.com/microsoft/ProjectReunion) umfasst verschiedene Technologien, wobei die ersten WinUI 3, WebView2 und MSIX sind.
Das WebView2-Steuerelement ist eine neue Windows-Plattformkomponente, in die Edge Chromium eingebettet ist. Wir haben diese Funktion in 10.4 mit der VCL-Komponente TEdgeBrowser unterstützt.
Der zweite Baustein wird die Unterstützung für das MSIX-Verpackungsformat sein, das wir für 10.4.2 planen. MSIX ist der Nachfolger von APPX, einem Ziel, das wir derzeit im Rahmen der Integration von RAD Studio IDE Desktop Bridge anbieten. Es ist für den Microsoft Store und die Unternehmensbereitstellung gedacht.
Ein weiterer Bereich unserer verbesserten Unterstützung für die Windows-Plattform und insbesondere für VCL-Anwendungen ist die Hinzufügung von zwei neuen Steuerelementen, die unseren Kunden helfen sollen, die Benutzeroberfläche ihrer Anwendungen zu modernisieren und zu verbessern. Wir arbeiten an neuen VCL Native Windows-Steuerelementen, damit Sie Ihren Kunden eine modernere Benutzeroberfläche bieten können:
Eine davon ist eine hochoptimierte virtuelle Listenansicht, mit der Sie eine große Anzahl von Elementen mit einer flexiblen Kombination aus Text und Grafiken anzeigen können. Das Steuerelement basiert lose auf dem Ansatz des vorhandenen DBCtrlGrid-Steuerelements, erfordert jedoch keine Datenquelle. Es wird die Verwendung von Live-Bindungen unterstützen.
Die andere neue VCL-Komponente, die wir hinzufügen, ist ein numerisches Eingabesteuerelement, ähnlich dem WinUI NumberBox-Plattformsteuerelement. Dieses Steuerelement bietet eine einfachere und reibungslosere numerische Eingabe unter Berücksichtigung verschiedener Formate (Ganzzahlen, Gleitkommazahlen, Währungswerte) und einschließlich der Auswertung einfacher Ausdrücke.
Der zweite Teil unserer Verbesserungen konzentriert sich auf die derzeit unterstützten Zielplattformen. Wir planen die vollständige Kompatibilität mit neuen Versionen von Betriebssystemen, die von Apple und Google veröffentlicht wurden, nachdem RAD Studio 10.4.1 veröffentlicht wurde. Obwohl Sie diese Plattformen heute gezielt einsetzen können, gibt es einige offene Probleme, die wir ordnungsgemäß angehen möchten (und nicht über Problemumgehungen). Das Ziel ist die vollständige Unterstützung für:
iOS 14 und iPadOS 14 (Delphi und C ++)
macOS 11.0 Big Sur (Intel) (Delphi)
Android 11 (Delphi)
In Bezug auf die Qualität werden wir in 10.4.2 (wie in 10.4.1) weiterhin erhebliche Anstrengungen in Bezug auf Stabilität, Leistung und Qualität unternehmen. Wir planen, von Kunden gemeldete Probleme zu beheben und Eskalationen in vielen Bereichen des Produkts zu unterstützen. Zu den Tools und Bibliotheken, auf die wir uns besonders konzentrieren werden, gehören zusätzlich zu den zuvor von David aufgeführten:
Der Delphi-Compiler (für alle Plattformen) verbessert seine Robustheit und Abwärtskompatibilität, konzentriert sich jedoch besonders auf die Leistung des Compilers (und Linkers), um die Kompilierungszeit für große Projekte zu verkürzen und die LSP-Engine (die den Compiler verwendet, zu beschleunigen) den Quellcode analysieren).
Die SOAP-Clientbibliothek zusammen mit dem WSDL-Importtool, das den Clientcode generiert, der für die Schnittstelle mit SOAP-Servern verwendet wird
Die Parallel Programming Library (PPL) bietet eine hervorragende Abstraktion der verschiedenen Plattformen und Threading-Funktionen für Multi-Core-CPUs in Bezug auf Aufgaben, Zukunft und Parallel-for-Loops
Die mehrschichtigen Webdienstlösungen sind Teil von RAD Studio und bieten Verbesserungen sowohl für RAD Server als auch für die ältere DataSnap-Engine sowie allgemeine Verbesserungen für die HTTP- und REST-Clientbibliotheken. Wir werden uns auch weiterhin auf unsere Azure- und AWS-Cloud-Unterstützung konzentrieren.
VCL-Stile und HighDPI-Stile werden zusammen mit VCL im Allgemeinen besondere Aufmerksamkeit erhalten
Für die FireMonkey-Bibliothek werden die TMemo-Komponenten (sowohl in der Plattform- als auch in der gestalteten Version), der in 10.4 eingeführte Metal GPU-Bibliothekstreiber und die Überarbeitung der Sensorverwaltung unter Android weiter verbessert, um eine bessere Unterstützung für eine Vielzahl von Android-Geräten zu bieten.
RAD Studio 10.5
Als Referenz ist hier noch einmal die Haupt-Roadmap-Folie:
Davids Kommentar zu 10.5 Plänen
Benutzererfahrung
Wir haben eine Reihe großartiger neuer Funktionen, auf die sich viele Kunden freuen und die für 10.5 geplant sind.
Erstens planen wir volle Unterstützung für hohe DPI in der IDE. Die VCL unterstützt seit einigen Releases hohe DPI-Werte, und die RAD Studio-IDE, die hauptsächlich die VCL verwendet, unterstützt jetzt auch hohe DPI-Werte. Dies stellt sicher, dass es auf allen modernen hochauflösenden Bildschirmen gestochen scharf wiedergegeben wird, auch wenn Sie Fenster über Bildschirme mit unterschiedlichen Auflösungen und Maßstäben bewegen.
Der VCL-Formular-Designer ist eines der wichtigsten Tools, die Sie beim Erstellen Ihrer App verwenden. Der Designer möchte schnell eine Benutzeroberfläche erstellen, die dem Aussehen Ihrer App sehr nahe kommt, im Gegensatz zu UI-Tools, die eine Benutzeroberfläche nur in Textform beschreiben und keine unmittelbare Rückkopplungs- / Iterationsschleife bieten. In 10.5 planen wir, dieses Element so zu erweitern, dass es dem Aussehen Ihrer App beim Ausführen ähnelt, indem wir dem Designer Unterstützung im VCL-Stil hinzufügen. Wenn also eines Ihrer Steuerelemente so gestaltet ist, werden Sie es auch im Designer sehen.
Der FMX-Formulardesigner ist ebenfalls ein wichtiges Werkzeug beim Erstellen einer plattformübergreifenden Anwendung. Wir planen, einige der Design-Tools des VCL-Designers, wie z. B. Ausrichtungshilfen, zu verwenden, um sicherzustellen, dass der Designer über die Produktivitätsfunktionen verfügt, die Sie benötigen.
Wir planen außerdem, uns auf die Integration der Quellcodeverwaltung der IDE zu konzentrieren, um die Zusammenarbeit Ihres Teams zu unterstützen. Darüber hinaus planen wir einige Verbesserungen bei der Darstellung der IDE bei der ersten Ausführung, um den Neulingen in Delphi und C ++ Builder den Einstieg zu erleichtern.
Schließlich verwenden viele Kunden Delphi oder C ++ Builder auf einem dedizierten Build-Server. Neben der Quellcodeverwaltung, Tests und ähnlichen Methoden empfiehlt es sich, offizielle Builds auf einem bestimmten Computer oder einer bestimmten VM durchzuführen. Derzeit müssen Sie zur Installation von RAD für einen Build-Server die vollständige IDE installieren. Dies sollte jedoch nicht erforderlich sein, da für das Erstellen nur die Befehlszeilentools erforderlich sind. Wir planen ein Installationsszenario speziell für Build-Server.
C ++ Builder
In 10.4.0 haben wir einen neuen Debugger für C ++ Win64 eingeführt. Dies bezog sich auf eine häufige Kundenanfrage, insbesondere weil wir „Formatierer“ einbezogen haben, mit denen der Inhalt von STL-Containern oder einer beliebigen Datenstruktur, einschließlich Ihrer eigenen, einfach bewertet werden kann. Dies war ein völlig neuer Debugger, keine neue Version der zuvor verwendeten. In 10.5 planen wir einen ähnlichen neuen Ersatz für ein anderes Kernwerkzeug, den Linker. Wie der Debugger wird dies für Win64 sein.
Sie werden hier einen Fokus auf 64-Bit-Windows bemerken. Viele Kunden verwenden Clang, um auf Win64 abzuzielen, und wir möchten sicherstellen, dass unsere Werkzeuge gleich oder besser sind als die Werkzeuge, die Sie vom klassischen Compiler gewohnt sind. Darüber hinaus beschäftigen sich viele Menschen ausschließlich mit 64-Bit, wobei 32-Bit-Apps aktualisiert werden und neue Apps nur 64-Bit sind.
Visual Assist ist eine erstaunliche Produktivitätserweiterung für Visual C ++, die Code-Vervollständigung, Refactorings und mehr bietet. Wir haben nach verschiedenen Möglichkeiten gesucht, um es in C ++ Builder zu integrieren, und planen dies in 10.5.
Schließlich planen wir auch, Delphi / C ++ Interop zu verbessern. Die Verwendung von zwei Sprachen ist ein großer Produktivitätsschub und einer der Hauptgründe für die Verwendung von C ++ Builder oder RAD Studio. Dies ist eine Arbeit, um diese Integration zu verbessern. Es sollte eine reibungslosere Integration mit RTL-Funktionen ermöglichen.
Delphi Debugger
In 10.4 haben wir einen völlig neuen Debugger für C ++ Win64 (siehe oben) eingeführt, der auf LLDB basiert. Letztendlich wollen wir auf allen Plattformen denselben Debugger verwenden – heute verwenden wir eine Mischung aus verschiedenen Debuggern. Der Schlüssel dazu ist das Hinzufügen eines Delphi-Sprach-Frontends zur LLDB, mit dem Sie die Delphi-Syntax beispielsweise im Dialogfeld „Auswerten / Ändern“ auswerten können. Wir planen, die erste Plattform mit LLDB mit diesem neuen Frontend in 10.5 einzuführen.
Marcos Kommentar zu 10.5 Plänen
Plattformen
In Bezug auf die Windows-Plattform planen wir, wie bereits erwähnt, Unterstützung für die verschiedenen Technologien anzubieten, die Teil von Microsoft Project Reunion sind. Insbesondere in der Version RAD Studio 10.5 freuen wir uns darauf, die Unterstützung für modernes Windows UX über die WinUI 3-Bibliothek zu integrieren. Gemäß der Roadmap von Microsoft für die Bibliothek sollte es möglich sein, die Komponenten dieser Bibliothek in einer nativen Anwendung zu verwenden, die auf der klassischen API basiert und Formulare und Steuerelemente verschiedener Typen mischt. Die tatsächlichen Details hängen davon ab, was die Bibliothek in Bezug auf die Integration in native Anwendungen liefern wird. Derzeit planen wir jedoch, diese Bibliothek mit neuen spezifischen Steuerelementen in die VCL zu integrieren.
Apropos Plattformen: Wir möchten ein neues Ziel für Delphi-Anwendungen hinzufügen: einen neuen Compiler für die ARM-basierte Version des macOS-Betriebssystems mit Apple-Hardware, die von Apple Silicon-CPUs unterstützt wird. Während Sie Intel-Anwendungen ausführen können, besteht das Ziel darin, eine native ARM-Anwendung für die neue Generation von Macs zu haben.
Dies wird eine bedeutende Erweiterung von Delphi sein, einschließlich eines neuen Compilers, Aktualisierungen der Laufzeitbibliothek und der verschiedenen Bibliotheken auf hoher Ebene. Wir haben auch vor, die Delphi-Sprachsyntax für alle Plattformen zu erweitern und die Leistung des vom Compiler unter Windows generierten mathematischen Verarbeitungscodes zu verbessern, um Anwendungen bei der numerischen Verarbeitung zu beschleunigen.
Wir werden auch weiterhin an der Gesamtproduktqualität arbeiten und planen, einige Subsysteme auszuwählen, auf die wir uns konzentrieren möchten. Diese Entscheidung treffen wir, indem wir das Kundenfeedback für die aktuelle Version und die kommenden Updates bewerten.
Zusammenfassung
Wir haben einige großartige Pläne für die kommenden Versionen von Delphi, C ++ Builder und RAD Studio! Von aufregenden Änderungen an der Code-Vervollständigung für beide Sprachen bis hin zu einer IDE mit hoher DPI, Produktivitätsverbesserungen beim Codieren und Entwerfen, Windows-Benutzeroberfläche und neuen VCL-Komponenten, Delphi-Debugging, Apple Silicon (M1) -Unterstützung für Delphi, Qualitätsarbeit für die Compiler, Delphi und C ++ RTL, SOAP, Multi-Tier und mehr, ein neuer Linker für C ++ – die kommenden Versionen enthalten einige wirklich aufregende Arbeiten. Wir können es kaum erwarten, sie zu Ihnen zu bringen!
Hinweis: Diese Pläne und Roadmap stellen unsere Absichten zum jetzigen Zeitpunkt dar, aber unsere Entwicklungspläne und Prioritäten können sich ändern. Dementsprechend können wir keine Zusagen oder andere Formen der Zusicherung geben, dass wir letztendlich einige oder alle der beschriebenen Produkte im Zeitplan oder in der beschriebenen Reihenfolge oder überhaupt freigeben. Diese allgemeinen Hinweise auf Entwicklungspläne oder „Produkt-Roadmaps“ sollten nicht als Verpflichtung interpretiert oder ausgelegt werden, und die Rechte unserer Kunden auf Upgrades, Updates, Verbesserungen und andere Wartungsversionen werden nur in der geltenden Softwarelizenzvereinbarung festgelegt .
Tue Nov 17 2020 20:18:50 GMT+0700 (Western Indonesia Time)
por Marco Cantu, David Millington e Sarina DuPont
Introdução
A equipe de gerenciamento do produto Embarcadero RAD Studio atualiza regularmente o roteiro de desenvolvimento de produto para Delphi, C ++ Builder e RAD Studio. Como você pode ver em nossa postagem do blog oficial do roteiro, acabamos de lançar uma nova versão do roteiro, cobrindo os principais recursos que planejamos para os próximos 12 meses. Junto com os slides do roteiro oficial, queríamos oferecer mais detalhes, informações e percepções com esta postagem de blog adicional. Pode ser útil abrir os slides para referência enquanto lê as informações expandidas que fornecemos aqui.
Em nosso roteiro, você pode encontrar os principais recursos que planejamos para o ano civil de 2021. Antes de entrarmos nos detalhes de nosso roteiro atualizado, queremos recapitular o que entregamos até agora.
No início deste ano, lançamos 10.4 Sydney. O lançamento 10.4 foi muito bem recebido por nossos clientes e incluiu a primeira entrega de nossa reescrita completa do mecanismo Delphi Code Insight, agora baseado na arquitetura de protocolo Language Server, um novo depurador para C ++ Win64, que atendeu a uma solicitação de cliente muito antiga e novos recursos de linguagem Delphi, como registros gerenciados personalizados. Também expandimos significativamente o caso de uso de estilos VCL com suporte para monitores HighDPI e estilo por controle.
Demos seguimento à versão 10.4 de Sydney com a versão 10.4.1 em setembro de 2020, que se concentrou principalmente na qualidade e nas melhorias adicionais dos recursos fornecidos na 10.4, em particular o suporte Delphi LSP recém-adicionado. 10.4.1 inclui mais de 800 melhorias de qualidade, incluindo mais de 500 melhorias de qualidade para problemas relatados publicamente no Portal da Qualidade da Embarcadero.
Antes de entrarmos em detalhes sobre as versões 10.4.2 e 10.5, gostaríamos de destacar que a 10.4 / 10.4.1 foi uma das versões mais populares até o momento, com mais downloads em comparação com a 10.3 e a 10.2. Isso é especialmente impressionante no meio do COVID-19. Atribuímos o sucesso tanto ao lançamento quanto ao nosso maior engajamento com parceiros de tecnologia que continuam a colaborar com nossa equipe para atualizar e desenvolver novos recursos. Também queremos agradecer a vocês, nossos clientes, pelo ótimo feedback que vocês têm fornecido à equipe de produto, em termos de recursos que gostariam de ver adicionados e áreas nas quais gostaria que nos concentrássemos em termos de qualidade, e sua participação em nossos programas beta (que é um dos benefícios de ter uma assinatura).
Atualmente, estamos trabalhando na versão 10.4.2, planejada para a primeira parte do ano civil de 2021 e detalhada no roteiro e nesta postagem de blog de comentários. Algum tempo antes do lançamento, esperamos convidar os clientes RAD Studio, Delphi e C ++ Builder com uma assinatura de atualização ativa para ingressar no teste beta para o próximo lançamento. O beta 10.4.2 será um beta NDA, exigindo que os participantes assinem nosso acordo de não divulgação antes de poderem participar do beta. Poder ingressar nos betas e participar do fornecimento de feedback para o gerenciamento de produtos no início do ciclo de desenvolvimento é um dos benefícios de estar atualizado com a assinatura de atualização.
Para o 10.5, planejamos introduzir uma nova plataforma de destino para Delphi, macOS ARM (baseado em CPUs Apple Silicon), trabalho significativo em torno do suporte IDE HighDPI, extensões de cadeia de ferramentas C ++ e muitos outros recursos adicionais e melhorias de qualidade. Veja abaixo para mais detalhes.
RAD Studio Roadmap Timeline
Antes de entrarmos nos detalhes dos recursos nos quais a equipe de desenvolvimento está trabalhando hoje ou pesquisando para o futuro, vamos dar uma olhada na linha do tempo dos próximos lançamentos, conforme mostrado no slide principal do roteiro:
Comentário de David sobre 10.4.2 Planos
Delphi Code Insight
Como Marco escreveu acima, em 10.4.1 nos concentramos muito na qualidade. Isso continua em 10.4.2, com uma área de trabalho significativo sendo o novo Delphi Code Insight (também conhecido como Delphi LSP). O 10.4.2 não apenas incluirá muitas correções e ajustes, como também recursos de insight de código menos usados que não incluímos incluem na versão inicial, mas também alguns recursos novos ou significativamente aprimorados no autocompletar de código. Por exemplo, planejamos adicionar ctrl-click em ‘herdado’, bem como preenchimento retrabalhado em cláusulas ‘usa’, entre outras.
C ++ Code Insight
C ++ também continua o tema do trabalho de qualidade contínuo, com foco em duas áreas.
O mais notável para todos os clientes C ++ será uma revisão completa do auto-completar de código C ++ ao usar os compiladores Clang. No 10.3, quando atualizamos para C ++ 17, tivemos que substituir a tecnologia de autocompletar de código que o IDE usava. Desde a sua introdução, temos aprimorado o preenchimento de código em cada versão, abordando casos de uso em que padrões de código ou configurações de projeto específicos podem causar problemas de conclusão.
Para 10.4.2, decidimos realizar uma revisão completa do preenchimento de código para C ++, para fornecer a produtividade do desenvolvedor que os clientes estão procurando. Os clientes de C ++ devem descobrir que o preenchimento de código e a navegação funcionam bem e de maneira confiável.
Já abordamos alguns casos mais difíceis, como fornecer preenchimento em um arquivo de cabeçalho (muito mais difícil do que em um arquivo .cpp)! O resultado final deve ser tudo o que você nos pediu.
Qualidade C ++ e tratamento de exceções
O outro foco de qualidade significativo para C ++ em 10.4.2 é em torno do tratamento de exceções.
O tratamento de exceções é uma área complexa, que requer interoperabilidade estreita entre o compilador e o RTL para funcionar corretamente. Existem convenções comuns para exceções, como nunca permitir que uma exceção ultrapasse o limite de um módulo (por exemplo, ser lançada em uma DLL, mas capturada em um EXE), mas nem sempre são seguidas, às vezes por bons motivos. Em C ++, precisamos lidar com exceções C ++, exceções do sistema operacional e SEH, não esquecendo o tratamento de exceções do Delphi também.
Em 10.4.2, revisamos o sistema de tratamento de exceções. À medida que nos aproximamos do lançamento, esperamos uma postagem no blog detalhando os cenários que oferecemos. Internamente, estamos vendo algumas grandes melhorias atualmente!
IDE
Além do foco no autocompletar de código para ambas as linguagens, o IDE tem algum outro trabalho planejado para 10.4.2.
No 10.3, introduzimos os dois temas atuais, um estilo claro e escuro (na verdade, um estilo escuro, embora significativamente diferente, foi introduzido pela primeira vez em 10.2.3. Era um de nossos recursos mais populares.) O estilo claro é predominantemente azul pálido. Nesta versão, estamos adicionando um terceiro estilo, que usa cinza tradicional e não azul para as cores principais. Considere um estilo retro para quem gosta de como o IDE parecia na era 2010-XE7, um retorno ao visual clássico. Também acreditamos que pode ser útil para aqueles que precisam de acomodações especiais para a visão.
Também planejamos mais trabalho de qualidade em torno de layouts de desktop, layouts de vários monitores, design de formulários e áreas semelhantes. Isso inclui permitir que você projete seu formulário no designer de formulário ao mesmo tempo em que abre o código desse formulário. De acordo com o feedback, este foi o motivo mais comum para usar o antigo designer desencaixado, que removemos em 10.4.1, e estamos felizes em permitir que você codifique e projete em uma unidade de formulário usando o designer moderno.
Finalmente, queremos aprimorar a ferramenta de migração de configurações, para ajudar a mover as configurações do RAD Studio de uma versão para outra (como de 10.3 para 10.4) e para melhor preservar sua configuração ao mudar para uma versão de atualização (como de 10.4.1 para 10.4.2 ) Planejamos adicionar configurações predefinidas específicas para cada cenário e incluir arquivos de configuração, além das configurações de registro consideradas hoje.
Comentário de Marco sobre 10.4.2 Planos
Em termos de sistemas operacionais de destino, estamos atualmente focados em melhorar as plataformas existentes suportadas em 10.4.x, e há duas áreas de foco nas quais estamos trabalhando para 10.4.2.
O primeiro é parte de nosso foco contínuo no Windows como nosso alvo principal. No sistema operacional da Microsoft, estamos seguindo de perto a direção atual da Microsoft de unificar a API WinRT e a API Win tradicional, por meio do Project Reunion. O Project Reunion (https://github.com/microsoft/ProjectReunion) compreende diferentes tecnologias, sendo as iniciais WinUI 3, WebView2 e MSIX.
O controle WebView2 é um novo componente da plataforma Windows que incorpora o Edge Chromium. Fornecemos suporte para esse recurso na versão 10.4 com o componente TEdgeBrowser VCL.
O segundo bloco de construção será o suporte para o formato de pacote MSIX que planejamos para 10.4.2. MSIX é o sucessor do APPX, um destino que oferecemos atualmente como parte da integração do RAD Studio IDE Desktop Bridge, e se destina à Microsoft Store e à implantação empresarial.
Outra área de nosso suporte aprimorado para a plataforma Windows, e em particular para aplicativos VCL, é a adição de dois novos controles que visam ajudar nossos clientes a modernizar e melhorar a UX de seus aplicativos. Estamos trabalhando em novos controles nativos do Windows VCL, para que você possa fornecer uma interface de usuário mais moderna para seus clientes:
Um deles é uma visualização de lista virtual altamente otimizada, que permitirá a você exibir um grande número de itens com uma combinação flexível de texto e gráficos. O controle será vagamente baseado na abordagem do controle DBCtrlGrid existente, mas sem exigir uma fonte de dados. Ele suportará o uso de Live Bindings.
O outro novo componente da VCL que estamos adicionando é um controle de entrada numérica, semelhante ao controle da plataforma WinUI NumberBox. Este controle fornece uma entrada numérica mais fácil e suave, levando em consideração diferentes formatos (inteiros, números de ponto flutuante, valores monetários) e também incluindo a avaliação de expressões simples.
A segunda parte de nossas melhorias concentra-se nas plataformas de destino atualmente suportadas. Planejamos oferecer compatibilidade total com novas versões de sistemas operacionais lançados pela Apple e Google após o lançamento do RAD Studio 10.4.1. Embora você possa direcionar essas plataformas hoje, existem alguns problemas em aberto que queremos abordar adequadamente (em vez de por meio de soluções alternativas). O objetivo é ter suporte completo para:
iOS 14 e iPadOS 14 (Delphi e C ++)
macOS 11.0 Big Sur (Intel) (Delphi)
Android 11 (Delphi)
Em termos de qualidade, continuaremos com um esforço significativo de estabilidade, desempenho e qualidade em 10.4.2 (como fizemos em 10.4.1). Planejamos resolver os problemas relatados pelos clientes e dar suporte ao escalonamento em muitas áreas do produto. As ferramentas e bibliotecas nas quais iremos nos concentrar particularmente, além das listadas por David anteriormente, incluem:
O compilador Delphi (para todas as plataformas) para melhorar sua robustez e compatibilidade com versões anteriores, mas um foco particular e profundo no desempenho do compilador (e do vinculador) para reduzir o tempo de compilação para grandes projetos e também acelerar o mecanismo LSP (que usa o compilador para analisar o código-fonte).
A biblioteca do cliente SOAP junto com a ferramenta de importação WSDL que gera o código do cliente usado para fazer interface com os servidores SOAP
A Biblioteca de Programação Paralela (PPL), que oferece uma grande abstração das diferentes plataformas e capacidades de threading de CPUs multi-core, em termos de tarefas, futuros e loops paralelos
As soluções de serviço da web multicamadas parte do RAD Studio, com melhorias no servidor RAD e no mecanismo DataSnap mais antigo, e melhorias gerais nas bibliotecas de cliente HTTP e REST. Também continuaremos nos concentrando em nosso suporte à nuvem Azure e AWS.
Estilos VCL e estilos HighDPI vão receber atenção extra, junto com VCL em geral
Para a biblioteca FireMonkey, continuamos aprimorando os componentes do TMemo (na plataforma e nas versões estilizadas), o driver de biblioteca Metal GPU introduzido no 10.4 e retrabalho o gerenciamento do sensor no Android, para oferecer melhor suporte para uma variedade de dispositivos Android.
RAD Studio 10.5
Para referência, aqui está o slide do roteiro principal novamente:
Comentário de David sobre 10.5 Planos
Experiência de usuário
Temos uma série de novos recursos excelentes, esperados por muitos clientes, planejados para 10.5.
Em primeiro lugar, planejamos suporte total de alta DPI no IDE. O VCL oferece suporte a DPI alto há algumas versões agora, e o RAD Studio IDE, que usa principalmente o VCL, agora também oferece suporte a DPI alto. Isso garante que a renderização será nítida em todas as telas modernas de alta resolução, inclusive conforme você move as janelas nas telas com diferentes resoluções e escalas.
O designer de formulário VCL é uma das principais ferramentas que você usa ao criar seu aplicativo. O objetivo do designer é construir rapidamente uma IU, vendo de perto como ela ficará quando seu aplicativo for executado, em contraste com as ferramentas de IU que descrevem uma IU apenas em texto e não fornecem feedback imediato / loop de iteração. Na versão 10.5, planejamos estender esse elemento de aparência semelhante à aparência de seu aplicativo quando executado adicionando suporte ao estilo VCL para o designer, de modo que quando qualquer um de seus controles for estilizado, você os verá estilizados no designer também.
O designer de formulário FMX é similarmente uma ferramenta importante quando você constrói um aplicativo de plataforma cruzada. Planejamos trazer algumas das ferramentas de design que o designer VCL possui, como guias de alinhamento, para garantir que o designer tenha os recursos de produtividade de que você precisa.
Também planejamos nos concentrar na integração do controle de origem do IDE, para auxiliar a colaboração de sua equipe. Além disso, planejamos algumas melhorias em como o IDE é apresentado quando executado pela primeira vez, para ajudar aqueles que são novos no Delphi e no C ++ Builder para começar.
Finalmente, muitos clientes usam Delphi ou C ++ Builder em um servidor de compilação dedicado. Junto com o controle de origem, testes e práticas semelhantes, é uma boa prática ter compilações oficiais em uma máquina ou VM específica. Atualmente, para instalar o RAD para um servidor de construção, você precisa instalar o IDE completo – mas isso não deve ser necessário, porque a construção só precisa das ferramentas de linha de comando. Planejamos um cenário de instalação especificamente para construir servidores.
C ++ Builder
Em 10.4.0, introduzimos um novo depurador para C ++ Win64. Isso atendeu a uma solicitação comum do cliente, especialmente porque incluímos ‘formatadores’, uma maneira de avaliar facilmente o conteúdo de contêineres STL ou qualquer estrutura de dados, incluindo a sua. Este era um depurador completamente novo, não uma nova versão do que usávamos anteriormente. No 10.5, planejamos uma nova substituição semelhante para outra ferramenta principal, o vinculador. Como o depurador, será para Win64.
Você notará um foco no Windows de 64 bits aqui. Muitos clientes estão usando o Clang para direcionar o Win64 e queremos garantir que nossas ferramentas sejam iguais ou melhores do que as ferramentas com as quais você está acostumado no compilador clássico. Além disso, muitas pessoas estão começando a olhar exclusivamente para 64 bits, com aplicativos de 32 bits sendo atualizados e novos aplicativos sendo apenas de 64 bits.
Visual Assist é uma extensão de produtividade incrível para Visual C ++, fornecendo autocompletar código, refatorações e muito mais. Estamos pesquisando várias maneiras de integrá-lo ao C ++ Builder e planejamos fazer isso no 10.5.
Finalmente, também planejamos melhorar a interoperabilidade Delphi / C ++. Ser capaz de usar duas linguagens é um grande aumento de produtividade e um dos principais motivos para usar C ++ Builder ou RAD Studio, e isso é um trabalho para aprimorar essa integração. Deve fornecer integração mais suave com os recursos RTL.
Delphi Debugger
Na versão 10.4, introduzimos um depurador inteiramente novo para C ++ Win64 (mencionado acima) baseado em LLDB. Em última análise, pretendemos usar o mesmo depurador em todas as plataformas – hoje usamos uma mistura de depuradores diferentes. A chave para isso é adicionar um frontend de linguagem Delphi ao LLDB, que permite avaliar a sintaxe Delphi, por exemplo, na caixa de diálogo Avaliar / Modificar. Planejamos introduzir a primeira plataforma usando LLDB com este novo front-end no 10.5.
Comentário de Marco sobre 10.5 Planos
Plataformas
Em relação à plataforma Windows, conforme mencionado anteriormente, planejamos oferecer suporte para as diversas tecnologias que fazem parte do Microsoft Project Reunion. Em particular, na versão RAD Studio 10.5, estamos ansiosos para integrar o suporte para Windows UX moderno por meio da biblioteca WinUI 3. De acordo com o roadmap da Microsoft para a biblioteca, deve ser possível utilizar os componentes desta biblioteca em uma aplicação nativa baseada na API clássica, misturando formas e controles de diferentes tipos. Os detalhes reais dependerão do que a biblioteca fornecerá em termos de integração com aplicativos nativos, mas nosso plano atual é integrar esta biblioteca na VCL com novos controles específicos.
Falando em plataformas, queremos adicionar um novo alvo para os aplicativos Delphi: um novo compilador para a versão baseada em ARM do sistema operacional macOS com hardware Apple equipado com CPUs Apple Silicon. Embora você possa executar aplicativos Intel, o objetivo é ter um aplicativo ARM nativo para a nova geração de Macs.
Esta será uma extensão significativa do Delphi, incluindo um novo compilador, atualizações para a biblioteca de tempo de execução e as várias bibliotecas de alto nível. Também planejamos expandir a sintaxe da linguagem Delphi para todas as plataformas e melhorar o desempenho do código de processamento matemático que o compilador gera no Windows, tornando os aplicativos mais rápidos no processamento numérico.
Também continuaremos a trabalhar na qualidade geral do produto e planejamos selecionar alguns subsistemas nos quais focar, uma decisão que tomaremos avaliando o feedback dos clientes sobre a versão atual e as próximas atualizações.
Resumo
Temos ótimos planos para os próximos lançamentos de Delphi, C ++ Builder e RAD Studio! De mudanças emocionantes à conclusão de código para ambas as linguagens, para um IDE de alto DPI, melhorias de produtividade ao codificar e projetar, IU do Windows e novos componentes VCL, depuração Delphi, suporte Apple Silicon (M1) para Delphi, trabalho de qualidade para os compiladores, Delphi e C ++ RTL, SOAP, multicamadas e mais, um novo vinculador para C ++ – os próximos lançamentos contêm trabalhos realmente interessantes. Mal podemos esperar para levá-los até você!
Nota: Esses planos e roteiro representam nossas intenções nesta data, mas nossos planos e prioridades de desenvolvimento estão sujeitos a alterações. Conseqüentemente, não podemos oferecer nenhum compromisso ou outras formas de garantia de que, no final das contas, lançaremos um ou todos os produtos descritos na programação ou na ordem descrita, ou em todos. Essas indicações gerais de cronogramas de desenvolvimento ou “roteiros de produtos” não devem ser interpretadas ou interpretadas como qualquer forma de compromisso, e os direitos de nossos clientes a upgrades, atualizações, melhorias e outras versões de manutenção serão estabelecidos apenas no contrato de licença de software aplicável .
Tue Nov 17 2020 20:18:27 GMT+0700 (Western Indonesia Time)
por Marco Cantu, David Millington y Sarina DuPont
Introducción
El equipo de administración de productos de Embarcadero RAD Studio actualiza periódicamente la hoja de ruta de desarrollo de productos para Delphi, C ++ Builder y RAD Studio. Como puede ver en nuestra publicación de blog sobre la hoja de ruta oficial, acabamos de lanzar una nueva versión de la hoja de ruta, que cubre las funciones clave que hemos planeado para los próximos 12 meses. Junto con las diapositivas oficiales de la hoja de ruta, queríamos ofrecer más detalles, información y conocimientos con esta publicación de blog adicional. Puede resultarle útil abrir las diapositivas como referencia mientras lee la información ampliada que proporcionamos aquí.
En nuestra hoja de ruta, puede encontrar las funciones clave que hemos planeado para el año calendario 2021. Antes de llegar a los detalles de nuestra hoja de ruta actualizada, queremos recapitular lo que hemos entregado hasta ahora.
A principios de este año, lanzamos 10.4 Sydney. La versión 10.4 fue muy bien recibida por nuestros clientes e incluyó la primera entrega de nuestra reescritura completa del motor Delphi Code Insight, ahora basado en la arquitectura del protocolo Language Server, un nuevo depurador para C ++ Win64, que abordó una solicitud de un cliente de larga data. y nuevas características del lenguaje Delphi, como registros administrados personalizados. También ampliamos significativamente el caso de uso de los estilos VCL con soporte para monitores HighDPI y estilo por control.
Hicimos un seguimiento de la versión 10.4 de Sydney con 10.4.1 en septiembre de 2020, que se centró principalmente en la calidad y mejoras adicionales de las funciones entregadas en 10.4, en particular, la compatibilidad con Delphi LSP recién agregada. 10.4.1 incluye más de 800 mejoras de calidad, incluidas más de 500 mejoras de calidad para problemas informados públicamente en el portal de calidad de Embarcadero.
Antes de entrar en detalles sobre las versiones 10.4.2 y 10.5, queríamos resaltar que 10.4 / 10.4.1 ha sido una de nuestras versiones más populares hasta la fecha, con más descargas en comparación con 10.3 y 10.2. Esto es especialmente impresionante en medio de COVID-19. Atribuimos el éxito tanto al lanzamiento como a nuestro mayor compromiso con los socios tecnológicos que continúan colaborando con nuestro equipo para actualizar y desarrollar nuevas funciones. También queremos agradecerles a ustedes, nuestros clientes, por los excelentes comentarios que han brindado al equipo de productos, en términos de características que le gustaría ver agregadas y áreas en las que le gustaría que nos enfocamos en calidad y su participación. en nuestros programas beta (que es uno de los beneficios de estar suscrito).
Actualmente, estamos trabajando en la versión 10.4.2, planificada para la primera parte del año calendario 2021 y detallada en la hoja de ruta y en esta publicación de blog de comentarios. En algún momento antes del lanzamiento, esperamos invitar a los clientes de RAD Studio, Delphi y C ++ Builder con una suscripción de actualización activa a unirse a las pruebas beta para el próximo lanzamiento. La versión beta 10.4.2 será una NDA beta, que requiere que los participantes firmen nuestro acuerdo de no divulgación antes de poder participar en la versión beta. Ser capaz de unirse a las versiones beta y participar en el suministro de comentarios a la gestión de productos al principio del ciclo de desarrollo es uno de los beneficios de estar al día con la suscripción de actualizaciones.
Para 10.5, planeamos presentar una nueva plataforma de destino para Delphi, macOS ARM (basado en CPU de Apple Silicon), trabajo significativo en torno al soporte IDE HighDPI, extensiones de cadena de herramientas C ++ y muchas otras características adicionales y mejoras de calidad. Consulte a continuación para obtener más detalles.
Cronología de la hoja de ruta de RAD Studio
Antes de llegar a los detalles de las funciones en las que el equipo de desarrollo está trabajando hoy o investigando para el futuro, echemos un vistazo a la línea de tiempo de los próximos lanzamientos como se muestra en la diapositiva principal de la hoja de ruta:
Comentario de David de los planes 10.4.2
Información del código Delphi
Como escribió Marco anteriormente, en 10.4.1 nos centramos mucho en la calidad. Eso continúa en 10.4.2, con un área de trabajo significativo que es el nuevo Delphi Code Insight (también conocido como Delphi LSP). No solo 10.4.2 incluirá muchas correcciones y ajustes, así como características de información de código menos utilizadas que no incluimos. incluir en la versión inicial, pero también algunas características nuevas o significativamente mejoradas en la finalización del código. Por ejemplo, planeamos agregar ctrl-clic en “heredado”, así como la finalización modificada en las cláusulas de “usos”, entre otras.
Información sobre el código C ++
C ++ también continúa el tema del trabajo continuo de calidad, con un enfoque en dos áreas.
Lo más notorio para todos los clientes de C ++ será una revisión completa de la finalización del código C ++ al usar los compiladores de Clang. En 10.3, cuando actualizamos a C ++ 17, tuvimos que reemplazar la tecnología de finalización de código que usaba el IDE. Desde su introducción, hemos mejorado la finalización del código en cada versión, abordando casos de uso en los que patrones de código específicos o configuraciones de proyectos podrían causar problemas de finalización.
Para 10.4.2, decidimos llevar a cabo una revisión completa de la finalización del código para C ++, para proporcionar la productividad de desarrollador que los clientes buscan. Los clientes de C ++ deberían encontrar que la finalización de código y la navegación funcionan bien y de manera confiable.
Incluso hemos abordado algunos casos más difíciles, como proporcionar la finalización en un archivo de encabezado (mucho más difícil que en un archivo .cpp). El resultado final debe ser todo lo que nos ha pedido.
Manejo de excepciones y calidad de C ++
El otro enfoque de calidad significativo para C ++ en 10.4.2 es el manejo de excepciones.
El manejo de excepciones es un área compleja que requiere una estrecha interoperabilidad entre el compilador y RTL para funcionar correctamente. Existen convenciones comunes para las excepciones, como nunca permitir que una excepción cruce el límite de un módulo (por ejemplo, ser lanzada en una DLL pero atrapada en un EXE), pero estas no siempre se siguen, a veces por buenas razones. En C ++, necesitamos manejar las excepciones de C ++, las excepciones del sistema operativo y SEH, sin olvidar también el manejo de excepciones de Delphi.
En 10.4.2, hemos revisado el sistema de manejo de excepciones. A medida que nos acercamos al lanzamiento, esperamos una publicación de blog que detalle los escenarios que admitimos. Internamente, ¡estamos viendo algunas grandes mejoras actualmente!
IDE
Además del enfoque en la finalización del código para ambos lenguajes, el IDE tiene algún otro trabajo planeado para 10.4.2.
En 10.3, presentamos los dos temas actuales, un estilo claro y oscuro (de hecho, un estilo oscuro, aunque significativamente diferente, se introdujo por primera vez en 10.2.3. Era una de nuestras características más populares). El estilo claro es predominantemente azul pálido. En esta versión, agregamos un tercer estilo, uno que utiliza el gris tradicional, no el azul, para los colores principales. Considérelo un estilo retro para aquellos a quienes les gusta cómo se veía el IDE en la era 2010-XE7, una devolución de llamada al aspecto clásico. También creemos que puede ser útil para quienes requieren adaptaciones especiales para la vista.
También planificamos un trabajo de calidad adicional en torno a diseños de escritorio, diseños de varios monitores, diseño de formularios y áreas similares. Esto incluye permitirle diseñar su formulario en el diseñador de formularios al mismo tiempo que tiene abierto el código para ese formulario. Según los comentarios, esta fue la razón más común para usar el antiguo diseñador desacoplado, que eliminamos en 10.4.1, y nos complace permitirle codificar y diseñar en una unidad de formulario utilizando el diseñador moderno.
Finalmente, queremos mejorar la herramienta de migración de configuraciones, para ayudar a mover la configuración de RAD Studio de una versión a otra (como de 10.3 a 10.4) y para preservar mejor su configuración al pasar a una versión de actualización (como de 10.4.1 a 10.4.2 ). Planeamos agregar configuraciones preestablecidas específicas para cada escenario e incluir archivos de configuración además de las configuraciones de registro consideradas hoy.
Comentario de Marco de los planes 10.4.2
En términos de sistemas operativos objetivo, actualmente estamos enfocados en mejorar las plataformas existentes compatibles con 10.4.xy hay dos áreas de enfoque en las que estamos trabajando para 10.4.2.
El primero es parte de nuestro enfoque continuo en Windows como nuestro objetivo principal. En el sistema operativo de Microsoft, estamos siguiendo de cerca la dirección actual de Microsoft de unificar la API WinRT y la API Win tradicional, a través de Project Reunion. Project Reunion (https://github.com/microsoft/ProjectReunion) comprende diferentes tecnologías, siendo las iniciales WinUI 3, WebView2 y MSIX.
El control WebView2 es un nuevo componente de la plataforma de Windows que incorpora Edge Chromium. Hemos brindado soporte para esta función en 10.4 con el componente TEdgeBrowser VCL.
El segundo bloque de construcción será el soporte para el formato de empaquetado MSIX que estamos planeando para 10.4.2. MSIX es el sucesor de APPX, un objetivo que ofrecemos actualmente como parte de la integración de RAD Studio IDE Desktop Bridge, y está diseñado para Microsoft Store y para implementación empresarial.
Otra área de nuestro soporte mejorado para la plataforma Windows, y en particular para las aplicaciones VCL, es la adición de dos nuevos controles destinados a ayudar a nuestros clientes a modernizar y mejorar la UX de sus aplicaciones. Estamos trabajando en nuevos controles nativos de Windows VCL, para que pueda proporcionar una interfaz de usuario más moderna a sus clientes:
Una es una vista de lista virtual altamente optimizada, que le permitirá mostrar una gran cantidad de elementos con una combinación flexible de texto y gráficos. El control se basará libremente en el enfoque del control DBCtrlGrid existente, pero sin requerir una fuente de datos. Admitirá el uso de Live Bindings.
El otro componente nuevo de VCL que estamos agregando es un control de entrada numérico, similar al control de plataforma WinUI NumberBox. Este control proporciona una entrada numérica más fácil y fluida, teniendo en cuenta diferentes formatos (enteros, números de coma flotante, valores de moneda) y también incluye la evaluación de expresiones simples.
La segunda parte de nuestras mejoras se centra en las plataformas de destino compatibles actualmente. Planeamos ofrecer compatibilidad total con las nuevas versiones de los sistemas operativos lanzados por Apple y Google después de que saliera RAD Studio 10.4.1. Si bien puede apuntar a estas plataformas hoy, hay algunos problemas abiertos que queremos abordar de manera adecuada (en lugar de soluciones alternativas). El objetivo es tener un soporte completo para:
iOS 14 y iPadOS 14 (Delphi y C ++)
macOS 11.0 Big Sur (Intel) (Delphi)
Android 11 (Delphi)
En términos de calidad, continuaremos con un esfuerzo significativo en estabilidad, rendimiento y calidad en 10.4.2 (como hicimos en 10.4.1). Planeamos abordar los problemas reportados por los clientes y las escaladas de soporte en muchas áreas del producto. Las herramientas y bibliotecas en las que nos centraremos especialmente, además de las enumeradas anteriormente por David, incluyen:
El compilador Delphi (para todas las plataformas) para mejorar su robustez y compatibilidad con versiones anteriores, pero un enfoque particular y profundo en el rendimiento del compilador (y enlazador) para reducir el tiempo de compilación para proyectos grandes y también acelerar el motor LSP (que utiliza el compilador para analizar el código fuente).
La biblioteca del cliente SOAP junto con la herramienta de importación WSDL que genera el código del cliente que se utiliza para interactuar con los servidores SOAP.
La biblioteca de programación paralela (PPL), que ofrece una gran abstracción de las diferentes plataformas y capacidades de subprocesamiento de CPU de múltiples núcleos, en términos de tareas, futuros y bucles for paralelos
Las soluciones de servicios web de varios niveles forman parte de RAD Studio, con mejoras tanto en RAD Server como en el motor DataSnap más antiguo, y mejoras generales en las bibliotecas cliente HTTP y REST. También vamos a seguir centrándonos en nuestro soporte en la nube de Azure y AWS.
Los estilos VCL y los estilos HighDPI recibirán una atención especial, junto con VCL en general.
Para la biblioteca FireMonkey, continuamos mejorando los componentes TMemo (tanto en la plataforma como en las versiones con estilo), el controlador de la biblioteca Metal GPU introducido en 10.4 y la gestión de sensores de reelaboración en Android, para ofrecer un mejor soporte para una variedad de dispositivos Android.
RAD Studio 10.5
Como referencia, aquí está nuevamente la diapositiva principal de la hoja de ruta:
Comentario de David de los planes 10.5
Experiencia de usuario
Tenemos una serie de excelentes funciones nuevas, que muchos clientes esperan con ansias, planificadas para 10.5.
En primer lugar, planificamos el soporte completo de DPI alto en el IDE. El VCL ha admitido un DPI alto durante un par de versiones, y el IDE de RAD Studio, que utiliza principalmente el VCL, ahora también admitirá un DPI alto. Esto asegura que se renderizará nítidamente en todas las pantallas modernas de alta resolución, incluso cuando mueva ventanas a través de pantallas con diferentes resoluciones y escalas.
El diseñador de formularios VCL es una de las herramientas clave que utiliza al crear su aplicación. El objetivo del diseñador es crear rápidamente una interfaz de usuario viendo de cerca cómo se verá cuando se ejecute su aplicación, en contraste con las herramientas de interfaz de usuario que describen una interfaz de usuario solo en texto y no proporcionan un bucle de iteración / retroalimentación inmediata. En la versión 10.5, planeamos extender ese elemento de apariencia similar a cómo se verá su aplicación cuando se ejecute agregando soporte de estilo VCL al diseñador, de modo que cuando cualquiera de sus controles tenga estilo, también los verá en el diseñador.
El diseñador de formularios FMX es igualmente una herramienta clave cuando se crea una aplicación multiplataforma. Planeamos incorporar algunas de las herramientas de diseño que tiene el diseñador de VCL, como guías de alineación, para garantizar que el diseñador tenga las características de productividad que necesita.
También planeamos enfocarnos en la integración del control de fuente del IDE, para ayudar a la colaboración de su equipo. Además, planeamos algunas mejoras en la forma en que se presenta el IDE cuando se ejecuta por primera vez, para ayudar a los nuevos en Delphi y C ++ Builder a comenzar.
Finalmente, muchos clientes usan Delphi o C ++ Builder en un servidor de compilación dedicado. Junto con el control de código fuente, las pruebas y prácticas similares, es una buena práctica que las compilaciones oficiales se realicen en una máquina o VM específica. Actualmente, para instalar RAD para un servidor de compilación, debe instalar el IDE completo, pero esto no debería ser necesario, porque la compilación solo necesita las herramientas de línea de comandos. Planeamos un escenario de instalador específicamente para servidores de compilación.
Constructor de C ++
En 10.4.0, presentamos un nuevo depurador para C ++ Win64. Esto resolvió una solicitud común de los clientes, especialmente porque incluimos “formateadores”, una forma de evaluar fácilmente el contenido de los contenedores STL o cualquier estructura de datos, incluida la suya. Este era un depurador completamente nuevo, no una nueva versión del que usamos anteriormente. En la versión 10.5, planeamos un reemplazo nuevo similar para otra herramienta principal, el enlazador. Al igual que el depurador, será para Win64.
Notará un enfoque en Windows de 64 bits aquí. Muchos clientes están usando Clang para apuntar a Win64, y queremos asegurarnos de que nuestras herramientas estén a la par o sean mejores que las herramientas a las que puede estar acostumbrado del compilador clásico. Además, muchas personas están comenzando a mirar exclusivamente a 64 bits, con las aplicaciones de 32 bits actualizadas y las nuevas aplicaciones solo de 64 bits.
Visual Assist es una increíble extensión de productividad para Visual C ++, que brinda finalización de código, refactorizaciones y más. Hemos estado investigando varias formas de integrarlo en C ++ Builder y planeamos hacerlo en la versión 10.5.
Finalmente, también planeamos mejorar la interoperabilidad de Delphi / C ++. Poder usar dos lenguajes es un gran impulso de productividad y una de las razones clave para usar C ++ Builder o RAD Studio, y esto es un trabajo para pulir esa integración. Debería proporcionar una integración más fluida con las funciones RTL.
Depurador de Delphi
En 10.4, presentamos un depurador completamente nuevo para C ++ Win64 (mencionado anteriormente) basado en LLDB. En última instancia, nuestro objetivo es utilizar el mismo depurador en todas las plataformas; hoy utilizamos una combinación de depuradores diferentes. La clave para esto es agregar una interfaz de lenguaje Delphi a LLDB, que le permite evaluar la sintaxis de Delphi en, por ejemplo, el diálogo Evaluar / Modificar. Planeamos presentar la primera plataforma que usa LLDB con esta nueva interfaz en 10.5.
Comentario de Marco sobre los planes 10.5
Plataformas
Con respecto a la plataforma Windows, como se mencionó anteriormente, planeamos ofrecer soporte para las diversas tecnologías que forman parte de Microsoft Project Reunion. En particular, en la versión RAD Studio 10.5, esperamos integrar el soporte para Windows UX moderno a través de la biblioteca WinUI 3. De acuerdo con la hoja de ruta de Microsoft para la biblioteca, debería ser posible utilizar los componentes de esta biblioteca en una aplicación nativa basada en la API clásica, mezclando formas y controles de diferentes tipos. Los detalles reales dependerán de lo que ofrecerá la biblioteca en términos de integración con aplicaciones nativas, pero nuestro plan actual es integrar esta biblioteca en la VCL con nuevos controles específicos.
Hablando de plataformas, queremos agregar un nuevo objetivo para las aplicaciones Delphi: un nuevo compilador para la versión basada en ARM del sistema operativo macOS con hardware Apple impulsado por CPU Apple Silicon. Si bien puede ejecutar aplicaciones Intel, el objetivo es tener una aplicación ARM nativa para la nueva generación de Mac.
Esta será una extensión significativa de Delphi, que incluye un nuevo compilador, actualizaciones de la biblioteca en tiempo de ejecución y las diversas bibliotecas de alto nivel. También tenemos planes de expandir la sintaxis del lenguaje Delphi para todas las plataformas y mejorar el rendimiento del código de procesamiento matemático que genera el compilador en Windows, haciendo que las aplicaciones sean más rápidas en el procesamiento numérico.
También continuaremos trabajando en la calidad general del producto y planearemos seleccionar algunos subsistemas en los que enfocarnos, una decisión que tomaremos al evaluar los comentarios de los clientes sobre la versión actual y las próximas actualizaciones.
Resumen
¡Tenemos grandes planes para las próximas versiones de Delphi, C ++ Builder y RAD Studio! Desde cambios emocionantes para completar el código para ambos lenguajes, hasta un IDE de alto DPI, mejoras de productividad al codificar y diseñar, interfaz de usuario de Windows y nuevos componentes VCL, depuración de Delphi, soporte de Apple Silicon (M1) para Delphi, trabajo de calidad para los compiladores, Delphi y C ++ RTL, SOAP, multinivel y más, un nuevo enlazador para C ++: las próximas versiones contienen un trabajo realmente emocionante. ¡Estamos ansiosos por enviárselos!
Nota: Estos planes y la hoja de ruta representan nuestras intenciones a esta fecha, pero nuestros planes de desarrollo y prioridades están sujetos a cambios. En consecuencia, no podemos ofrecer ningún compromiso u otra forma de garantía de que finalmente lanzaremos alguno o todos los productos descritos en el cronograma o en el orden descrito, o en absoluto. Estas indicaciones generales de cronogramas de desarrollo o “hojas de ruta de productos” no deben interpretarse ni interpretarse como ninguna forma de compromiso, y los derechos de nuestros clientes a las actualizaciones, actualizaciones, mejoras y otras versiones de mantenimiento se establecerán únicamente en el acuerdo de licencia de software correspondiente. .
Tue Nov 17 2020 17:04:45 GMT+0700 (Western Indonesia Time)
Это сообщение в блоге включает слайды с последним планом развития RAD Studio, включая планы для Delphi и C ++ Builder. Вы также можете прочитать соответствующую запись в блоге RAD Studio November 2020 Roadmap PM Commentary для более подробного описания запланированных функций.
Tue Nov 17 2020 17:03:06 GMT+0700 (Western Indonesia Time)
Esta postagem de blog inclui os slides do roteiro mais recente do RAD Studio, incluindo planos para Delphi e C ++ Builder. Você também pode ler a postagem do blog do RAD Studio Novembro 2020 Roadmap PM Commentary para uma descrição mais detalhada dos recursos planejados.
Tue Nov 17 2020 17:00:45 GMT+0700 (Western Indonesia Time)
Dieser Blog-Beitrag enthält die Folien der neuesten RAD Studio-Roadmap, einschließlich der Pläne für Delphi und C ++ Builder. Eine detailliertere Beschreibung der geplanten Funktionen finden Sie auch im zugehörigen Blog-Beitrag zu RAD Studio November 2020 Roadmap PM-Kommentar.
Mon Nov 16 2020 20:46:45 GMT+0700 (Western Indonesia Time)
Hello, and welcome to the last episode of this Flutter series! 👋
In the previous episodes, we looked at some basic Dart and Flutter concepts ranging from data structures and types, OOP and asynchrony to widgets, layouts, states, and props.
Alongside this course, I promised you (several times) that we’d build a fun mini-game in the last episode of this series - and the time has come.
The game we’ll build: ShapeBlinder
The name of the project is shapeblinder.
Just a little fun fact: I’ve already built this project in PowerPoint and Unity a few years ago. 😎 If you’ve read my previous, React-Native focused series, you may have noticed that the name is a bit alike to the name of the project in that one (colorblinder), and that’s no coincidence: this project is a somewhat similar minigame, and it’s the next episode of that casual game series.
We always talk about how some people just have a natural affinity for coding, or how some people feel the code after some time. While a series can’t help you getting to this level, we could write some code that we can physically feel when it’s working, so we’ll be aiming for that.
The concept of this game is that there is a shape hidden on the screen. Tapping the hidden shape will trigger a gentle haptic feedback on iPhones and a basic vibration on Android devices. Based on where you feel the shape, you’ll be able to guess which one of the three possible shapes is hidden on the screen.
Before getting to code, I created a basic design for the project. I kept the feature set, the distractions on the UI, and the overall feeling of the app as simple and chic as possible. This means no colorful stuff, no flashy stuff, some gentle animations, no in-app purchases, no ads, and no tracking.
We’ll have a home screen, a game screen and a “you lost” screen. A title-subtitle group will be animated across these screens. Tapping anywhere on the home screen will start, and on the lost screen will restart the game. We’ll also have some data persistency for storing the high scores of the user.
The full source code is available on GitHub here. You can download the built application from both Google Play and App Store.
Now go play around with the game, and after that, we’ll get started! ✨
Initializing the project
First, and foremost, I used the already discussed flutter create shapeblinder CLI command. Then, I deleted most of the code and created my usual go-to project structure for Flutter:
Inside the lib, I usually create a core and a ui directory to separate the business logic from the UI code. Inside the ui dir, I also add a screens and widgets directory. I like keeping these well-separated - however, these are just my own preferences!
Feel free to experiment with other project structures on your own and see which one is the one you naturally click with. (The most popular project structures you may want to consider are MVC, MVVM, or BLoC, but the possibilities are basically endless!)
After setting up the folder structure, I usually set up the routing with some very basic empty screens. To achieve this, I created a few dummy screens inside the lib/ui/screens/.... A simple centered text widget with the name of the screen will do it for now:
Notice that I only used classes, methods, and widgets that we previously discussed. Just a basic StatelessWidget with a Scaffold so that our app has a body, and a Text wrapped with a Center. Nothing heavy there. I copied and pasted this code into the Game.dart and Lost.dart files too, so that I can set up the routing in the main.dart:
// lib/main.dart
import 'package:flutter/material.dart';
// import the screens we created in the previous step
import './ui/screens/Home.dart';
import './ui/screens/Game.dart';
import './ui/screens/Lost.dart';
// the entry point to our app
void main() {
runApp(Shapeblinder());
}
class Shapeblinder extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'ShapeBlinder',
// define the theme data
// i only added the fontFamily to the default theme
theme: ThemeData(
primarySwatch: Colors.grey,
visualDensity: VisualDensity.adaptivePlatformDensity,
fontFamily: "Muli",
),
home: Home(),
// add in the routes
// we'll be able to use them later in the Navigator.pushNamed method
routes: <String, WidgetBuilder>{
'/home': (BuildContext context) => Home(),
'/game': (BuildContext context) => Game(),
'/lost': (BuildContext context) => Lost(),
},
);
}
}
Make sure that you read the code comments for some short inline explanation! Since we already discussed these topics, I don’t really want to take that much time into explaining these concepts from the ground up - we’re just putting them into practice to see how they work before you get your hands dirty with real-life projects.
Adding assets, setting up the font
You may have noticed that I threw in a fontFamily: “Muli” in the theme data. How do we add this font to our project? There are several ways: you could, for example, use the Google Fonts package, or manually add the font file to the project. While using the package may be handy for some, I prefer bundling the fonts together with the app, so we’ll add them manually.
The first step is to acquire the font files: in Flutter, .ttf is the preferred format. You can grab the Muli font this project uses from Google Fonts here.
(Update: the font has been removed from Google Fonts. You’ll be able to download it soon bundled together with other assets such as the app icon and the svgs, or you could also use a new, almost identical font by the very same author, Mulish).
Then, move the files somewhere inside your project. The assets/fonts directory is a perfect place for your font files - create it, move the files there and register the fonts in the pubspec.yaml:
You can see that we were able to add the normal and italic versions in a single family: because of this, we won’t need to use altered font names (like “Muli-Italic”). After this - boom! You’re done. 💥 Since we previously specified the font in the app-level theme, we won’t need to refer to it anywhere else - every rendered text will use Muli from now on.
Now, let’s add some additional assets and the app icon. We’ll have some basic shapes as SVGs that we’ll display on the bottom bar of the Game screen. You can grab every asset (including the app icon, font files, and svgs) from here. You can just unzip this and move it into the root of your project and expect everything to be fine.
Before being able to use your svgs in the app, you need to register them in the pubspec.yaml, just like you had to register the fonts:
And finally, to set up the launcher icon (the icon that shows up in the system UI), we’ll use a handy third-party package flutter_launcher_icons. Just add this package into the dev_dependencies below the normal deps in the pubspec.yaml:
...and then configure it, either in the pubspec.yaml or by creating a flutter_launcher_icons.yaml config file. A very basic configuration is going to be just enough for now:
And then, you can just run the following commands, and the script will set up the launcher icons for both Android and iOS:
flutter pub get
flutter pub run flutter_launcher_icons:main
After installing the app either on a simulator, emulator, or a connected real-world device with flutter run, you’ll see that the app icon and the font family is set.
You can use a small r in the CLI to reload the app and keep its state, and use a capital R to restart the application and drop its state. (This is needed when big changes are made in the structure. For example, a StatelessWidget gets converted into a stateful one; or when adding new dependencies and assets into your project.)
Building the home screen
Before jumping right into coding, I always like to take my time and plan out how I’ll build that specific screen based on the screen designs. Let’s have another, closer look at the designs I made before writing them codez:
We can notice several things that will affect the project structure:
The Home and the Lost screen look very identical to each other
All three screens have a shared Logo component with a title (shapeblinder / you lost) and a custom subtitle
So, let’s break down the Home and Lost screens a bit:
The first thing we’ll notice is that we’ll need to use a Column for the layout. (We may also think about the main and cross axis alignments - they are center and start, respectively. If you wouldn’t have known it by yourself, don’t worry - you’ll slowly develop a feeling for it. Until then, you can always experiment with all the options you have until you find the one that fits.)
After that, we can notice the shared Logo or Title component and the shared Tap component. Also, the Tap component says “tap anywhere [on the screen] to start (again)”. To achieve this, we’ll wrap our layout in a GestureDetector so that the whole screen can respond to taps.
Let’s hit up Home.dart and start implementing our findings. First, we set the background color in the Scaffold to black:
return Scaffold(
backgroundColor: Colors.black,
And then, we can just go on and create the layout in the body. As I already mentioned, I’ll first wrap the whole body in a GestureDetector. It is a very important step because later on, we’ll just be able to add an onTap property, and we’ll be just fine navigating the user to the next screen.
Inside the GestureDetector, however, I still won’t be adding the Column widget. First, I’ll wrap it in a SafeArea widget. SafeArea is a handy widget that adds additional padding to the UI if needed because of the hardware (for example, because of a notch, a swipeable bottom bar, or a camera cut-out). Then, inside that, I’ll also add in a Padding so that the UI can breathe, and inside that, will live our Column. The widget structure looks like this so far:
Oh, and by the way, just to flex with the awesome tooling of Flutter - you can always have a peek at how your widget structure looks like in the VS Code sidebar:
And this is how our code looks right now:
import 'package:flutter/material.dart';
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.black,
body: GestureDetector(
// tapping on empty spaces would not trigger the onTap without this
behavior: HitTestBehavior.opaque,
onTap: () {
// navigate to the game screen
},
// SafeArea adds padding for device-specific reasons
// (e.g. bottom draggable bar on some iPhones, etc.)
child: SafeArea(
child: Padding(
padding: const EdgeInsets.all(40.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
],
),
),
),
),
);
}
}
Creating Layout template
And now, we have a nice frame or template for our screen. We’ll use the same template on all three screens of the app (excluding the Game screen where we won’t include a GestureDetector), and in cases like this, I always like to create a nice template widget for my screens. I’ll call this widget Layout now:
// lib/ui/widgets/Layout.dart
import 'package:flutter/material.dart';
class Layout extends StatelessWidget {
// passing named parameters with the ({}) syntax
// the type is automatically inferred from the type of the variable
// (in this case, the children prop will have a type of List<Widget>)
Layout({this.children});
final List<Widget> children;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.black,
// SafeArea adds padding for device-specific reasons
// (e.g. bottom draggable bar on some iPhones, etc.)
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(40.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: children,
),
),
),
);
}
}
Now, in the Home.dart, we can just import this layout and wrap it in a GestureDetector, and we’ll have the very same result that we had previously, but we saved tons of lines of code because we can reuse this template on all other screens:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import "../widgets/Layout.dart";
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GestureDetector(
// tapping on empty spaces would not trigger the onTap without this
behavior: HitTestBehavior.opaque,
onTap: () {
// navigate to the game screen
},
child: Layout(
children: <Widget>[
],
),
);
}
}
Oh, and remember this because it’s a nice rule of thumb: whenever you find yourself copying and pasting code from one widget to another, it’s time to extract that snippet into a separate widget. It really helps to keep spaghetti code away from your projects. 🍝
Now that the overall wrapper and the GestureDetector is done, there are only a few things left on this screen:
Implementing the navigation in the onTap prop
Building the Logo widget (with the title and subtitle)
Building the Tap widget (with that circle-ey svg, title, and subtitle)
Implementing navigation
Inside the GestureDetector, we already have an onTap property set up, but the method itself is empty as of now. To get started with it, we should just throw in a console.log, or, as we say in Dart, a print statement to see if it responds to our taps.
onTap: () {
// navigate to the game screen
print("hi!");
},
Now, if you run this code with flutter run, anytime you’ll tap the screen, you’ll see “hi!” being printed out into the console. (You’ll see it in the CLI.)
That’s amazing! Now, let’s move forward to throwing in the navigation-related code. We already looked at navigation in the previous episode, and we already configured named routes in a previous step inside the main.dart, so we’ll have a relatively easy job now:
onTap: () {
// navigate to the game screen
Navigator.pushNamed(context, "/game");
},
And boom, that’s it! Tapping anywhere on the screen will navigate the user to the game screen. However, because both screens are empty, you won’t really notice anything - so let’s build the two missing widgets!
Building the Logo widget, Hero animation with text in Flutter
Let’s have another look at the Logo and the Tap widgets before we implement them:
We’ll start with the Logo widget because it’s easier to implement. First, we create an empty StatelessWidget:
// lib/ui/widgets/Logo.dart
import "package:flutter/material.dart";
class Logo extends StatelessWidget {
}
Then we define two properties, title and subtitle, with the method we already looked at in the Layout widget:
import "package:flutter/material.dart";
class Logo extends StatelessWidget {
Logo({this.title, this.subtitle});
final String title;
final String subtitle;
@override
Widget build(BuildContext context) {
}
}
And now, we can just return a Column from the build because we are looking forward to rendering two text widgets underneath each other.
And notice how we were able to just use title and subtitle even though they are properties of the widget. We’ll also add in some text styling, and we’ll be done for now - with the main body.
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
title,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 34.0,
color: Colors.white,
),
),
Text(
subtitle,
style: TextStyle(
fontSize: 24.0,
// The Color.xy[n] gets a specific shade of the color
color: Colors.grey[600],
fontStyle: FontStyle.italic,
),
),
],
)
Now this is cool and good, and it matches what we wanted to accomplish - however, this widget could really use a nice finishing touch. Since this widget is shared between all of the screens, we could add a really cool Hero animation. The Hero animation is somewhat like the Magic Move in Keynote. Go ahead and watch this short Widget of The Week episode to know what a Hero animation is and how it works:
This is very cool, isn’t it? We’d imagine that just wrapping our Logo component in a Hero and passing a key would be enough, and we’d be right, but the Text widget’s styling is a bit odd in this case. First, we should wrap the Column in a Hero and pass in a key like the video said:
return Hero(
tag: "title",
transitionOnUserGestures: true,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
title,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 34.0,
color: Colors.white,
),
),
Text(
subtitle,
style: TextStyle(
fontSize: 24.0,
// The Color.xy[n] gets a specific shade of the color
color: Colors.grey[600],
fontStyle: FontStyle.italic,
),
),
],
),
);
But when the animation is happening, and the widgets are moving around, you’ll see that Flutter drops the font family and the Text overflows its container. So we’ll need to hack around Flutter with some additional components and theming data to make things work:
import "package:flutter/material.dart";
class Logo extends StatelessWidget {
Logo({this.title, this.subtitle});
final String title;
final String subtitle;
@override
Widget build(BuildContext context) {
return Hero(
tag: "title",
transitionOnUserGestures: true,
child: Material(
type: MaterialType.transparency,
child: Container(
width: MediaQuery.of(context).size.width,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
title,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 34.0,
color: Colors.white,
),
),
Text(
subtitle,
style: TextStyle(
fontSize: 24.0,
// The Color.xy[n] gets a specific shade of the color
color: Colors.grey[600],
fontStyle: FontStyle.italic,
),
),
],
),
),
),
);
}
}
This code will ensure that the text has enough space even if the content changes between screens (which will of course happen), and that the font style doesn’t randomly change while in-flight (or while the animation is happening).
Now, we’re finished with the Logo component, and it will work and animate perfectly and seamlessly between screens.
Building the Tap widget, rendering SVGs in Flutter
The Tap widget will render an SVG, a text from the props, and the high score from the stored state underneath each other. We could start by creating a new widget in the lib/ui/widgets directory. However, we’ll come to a dead-end after writing a few lines of code as Flutter doesn’t have native SVG rendering capabilities. Since we want to stick with SVGs instead of rendering them into PNGs, we’ll have to use a 3rd party package, flutter_svg.
To install it, we just simply add it to the pubspec.yaml into the dependencies:
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.3
flutter_svg: any
And after saving the file, VS Code will automatically run flutter pub get and thus install the dependencies for you. Another great example of the powerful Flutter developer tooling! 🧙
Now, we can just create a file under lib/ui/widgets/Tap.dart, import this dependency, and expect things to be going fine. If you were already running an instance of flutter run, you’ll need to restart the CLI when adding new packages (by hitting Ctrl-C to stop the current instance and running flutter run again):
// lib/ui/widgets/Tap.dart
import "package:flutter/material.dart";
// import the dependency
import "package:flutter_svg/flutter_svg.dart";
We’ll just start out with a simple StatelessWidget now, but we’ll refactor this widget later after we implemented storing the high scores! Until then, we only need to think about the layout: it’s a Column because children are underneath each other, but we wrap it into a Center so that it’s centered on the screen:
import "package:flutter/material.dart";
// import the dependency
import "package:flutter_svg/flutter_svg.dart";
class Tap extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Column(
children: <Widget>[
],
),
);
}
}
Now you may be wondering that setting the crossAxisAlignment: CrossAxisAlignment.center in the Column would center the children of the column, so why the Center widget?
The crossAxisAlignment only aligns children inside its parent’s bounds, but the Column doesn’t fill up the screen width. (You could, however, achieve this by using the Flexible widget, but that would have some unexpected side effects.).
On the other hand, Center aligns its children to the center of the screen. To understand why we need the Center widget and why setting crossAxisAlignment to center isn’t just enough, I made a little illustration:
Now that this is settled, we can define the properties of this widget:
Tap({this.title});
final String title;
And move on to building the layout. First comes the SVG - the flutter_svg package exposes an SvgPicture.asset method that will return a Widget and hence can be used in the widget tree, but that widget will always try to fill up its ancestor, so we need to restrict the size of it. We can use either a SizedBox or a Container for this purpose. It’s up to you:
And we’ll just render the two other texts (the one that comes from the props and the best score) underneath each other, leaving us to this code:
import "package:flutter/material.dart";
// import the dependency
import "package:flutter_svg/flutter_svg.dart";
class Tap extends StatelessWidget {
Tap({this.title});
final String title;
@override
Widget build(BuildContext context) {
return Center(
child: Column(
children: <Widget>[
Container(
height: 75,
child: SvgPicture.asset(
"assets/svg/tap.svg",
semanticsLabel: 'tap icon',
),
),
// give some space between the illustration and the text:
Container(
height: 14,
),
Text(
title,
style: TextStyle(
fontSize: 18.0,
color: Colors.grey[600],
),
),
Text(
"best score: 0",
style: TextStyle(
fontSize: 18.0,
color: Colors.grey[600],
fontStyle: FontStyle.italic,
),
),
],
),
);
}
}
Always take your time examining the code examples provided, as you’ll soon start writing code just like this.
Putting it all together into the final Home screen
Now that all two widgets are ready to be used on our Home and Lost screens, we should get back to the Home.dart and start putting them together into a cool screen.
First, we should import these classes we just made:
And inside the Layout, we already have a blank space as children, we should just fill it up with our new, shiny components:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import "../widgets/Layout.dart";
import "../widgets/Logo.dart";
import "../widgets/Tap.dart";
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GestureDetector(
// tapping on empty spaces would not trigger the onTap without this
behavior: HitTestBehavior.opaque,
onTap: () {
// navigate to the game screen
HapticFeedback.lightImpact();
Navigator.pushNamed(context, "/game");
},
child: Layout(
children: <Widget>[
Logo(
title: "shapeblinder",
subtitle: "a game with the lights off",
),
Tap(
title: "tap anywhere to start",
),
],
),
);
}
}
And boom! After reloading the app, you’ll see that the new widgets are on-screen. There’s only one more thing left: the alignment is a bit off on this screen, and it doesn’t really match the design. Because of that, we’ll add in some Spacers.
In Flutter, a Spacer is your <div style={{ flex: 1 }}/>, except that they are not considered to be a weird practice here. Their sole purpose is to fill up every pixel of empty space on a screen, and we can also provide them a flex value if we want one Spacer to be larger than another.
In our case, this is exactly what we need: we’ll need one large spacer before the logo and a smaller one after the logo:
Spacer(
flex: 2,
),
// add hero cross-screen animation for title
Logo(
title: "shapeblinder",
subtitle: "a game with the lights off",
),
Spacer(),
Tap(
title: "tap anywhere to start",
),
And this will push everything into place.
Building the Lost screen, passing properties to screens in Flutter with Navigator
Because the layout of the Lost screen is an exact copy of the Home screen except some differences here and there, we’ll just copy and paste the Home.dart into the Lost.dart and modify it like this:
class Lost extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
// navigate to the game screen
Navigator.pop(context);
},
child: Layout(
children: <Widget>[
Spacer(
flex: 2,
),
Logo(
title: "you lost",
subtitle: "score: 0",
),
Spacer(),
Tap(
title: "tap anywhere to start again",
),
],
),
);
}
}
However, this just won’t be enough for us now. As you can see, there is a hard-coded “score: 0” on the screen. We want to pass the score as a prop to this screen, and display that value here.
To pass properties to a named route in Flutter, you should create an arguments class. In this case, we’ll name it LostScreenArguments. Because we only want to pass an integer (the points of the user), this class will be relatively simple:
// passing props to this screen with arguments
// you'll need to construct this class in the sender screen, to
// (in our case, the Game.dart)
class LostScreenArguments {
final int points;
LostScreenArguments(this.points);
}
And we can extract the arguments inside the build method:
@override
Widget build(BuildContext context) {
// extract the arguments from the previously discussed class
final LostScreenArguments args = ModalRoute.of(context).settings.arguments;
// you'll be able to access it by: args.points
And just use the ${...}string interpolation method in the Text widget to display the score from the arguments:
Logo(
title: "you lost",
// string interpolation with the ${} syntax
subtitle: "score: ${args.points}",
),
And boom, that’s all the code needed for receiving arguments on a screen! We’ll look into passing them later on when we are building the Game screen…
Building the underlying Game logic
...which we’ll start right now. So far, this is what we’ve built and what we didn’t implement yet:
✅ Logo widget
✅ Hero animation
✅ Tap widget
✅ Rendering SVGs
✅ Home screen
✅ Lost screen
✅ Passing props
Underlying game logic
Game screen
Drawing shapes
Using haptic feedback
Storing high scores - persistent data
So there’s still a lot to learn! 🎓First, we’ll build the underlying game logic and classes. Then, we’ll build the layout for the Game screen. After that, we’ll draw shapes on the screen that will be tappable. We’ll hook them into our logic, add in haptic feedback, and after that, we’ll just store and retrieve the high scores, test the game on a real device, and our game is going to be ready for production!
The underlying game logic will pick three random shapes for the user to show, and it will also pick one correct solution. To pass around this generated data, first, we’ll create a class named RoundData inside the lib/core/RoundUtilities.dart:
class RoundData {
List<String> options;
int correct;
RoundData({this.options, this.correct});
}
Inside the assets/svg directory, we have some shapes lying around. We’ll store the names of the files in an array of strings so that we can pick random strings from this list:
// import these!!
import 'dart:core';
import 'dart:math';
class RoundData {
List<String> options;
int correct;
RoundData({this.options, this.correct});
}
// watch out - new code below!
Random random = new Random();
// the names represent all the shapes in the assets/svg directory
final List<String> possible = [
"circle",
"cross",
"donut",
"line",
"oval",
"square"
];
And notice that I also created a new instance of the Random class and imported a few native Dart libraries. We can use this random variable to get new random numbers between two values:
// this will generate a new random int between 0 and 5
random.nextInt(5);
The nextInt’s upper bound is exclusive, meaning that the code above can result in 0, 1, 2, 3, and 4, but not 5.
To get a random item from an array, we can combine the .length property with this random number generator method:
int randomItemIndex = random.nextInt(array.length);
Then, I’ll write a method that will return a RoundData instance:
RoundData generateRound() {
// new temporary possibility array
// we can remove possibilities from it
// so that the same possibility doesn't come up twice
List<String> temp = possible.map((item) => item).toList();
// we'll store possibilities in this array
List<String> res = new List<String>();
// add three random shapes from the temp possibles to the options
for (int i = 0; i < 3; i++) {
// get random index from the temporary array
int randomItemIndex = random.nextInt(temp.length);
// add the randomth item of the temp array to the results
res.add(temp[randomItemIndex]);
// remove possibility from the temp array so that it doesn't come up twice
temp.removeAt(randomItemIndex);
}
// create new RoundData instance that we'll be able to return
RoundData data = RoundData(
options: res,
correct: random.nextInt(3),
);
return data;
}
Take your time reading the code with the comments and make sure that you understand the hows and whys.
Game screen
Now that we have the underlying game logic in the lib/core/RoundUtilities.dart, let’s navigate back into the lib/ui/screens/Game.dart and import the utilities we just created:
And since we’d like to update this screen regularly (whenever a new round is generated), we should convert the Game class into a StatefulWidget. We can achieve this with a VS Code shortcut (right-click on class definition > Refactor… > Convert to StatefulWidget):
And now, we’ll build the layout. Let’s take a look at the mock for this screen:
Our screen already contains the shared Logo widget, and we’ll work with drawing shapes a bit later, so we’ll only have to cover
Proper spacing with Spacers
Creating a container for our shape
Drawing the three possible shapes on the bottom of the screen
Hooking them up to a tap handler
If the guess is correct, show a SnackBar and create a new round
If the guess in incorrect, end the session and navigate the user to the lost screen
Initializing data flow
So let’s get started! First, I’ll define the variables inside the state. Since this is a StatefulWidget, we can just define some variables inside the State and expect them to be hooked up to Flutter’s inner state management engine.
I’d also like to give them some values., so I’ll create a reset method. It will set the points to zero and create a new round with the generator we created previously. We’ll run this method when the initState method runs so that the screen is initialized with game data:
class _GameState extends State<Game> {
RoundData data;
int points = 0;
int high = 0;
final GlobalKey scaffoldKey = GlobalKey();
// the initState method is ran by Flutter when the element is first time painted
// it's like componentDidMount in React
@override
void initState() {
reset();
super.initState();
}
void reset() {
setState(() {
points = 0;
data = generateRound();
});
}
...
And now, we can move on to defining our layout:
Initializing the UI
Now that we have some data we can play around with, we can create the overall layout of this screen. First, I’ll create a runtime constant (or a final) I’ll call width. It will contain the available screen width:
@override
Widget build(BuildContext context) {
final width = MediaQuery.of(context).size.width;
I can use this to create a perfect square container for the shape that we’ll render later:
And we can use the state’s RoundData instance, data, to know which three possible shapes we need to render out. We can just simply map over it and use the spread operator to pass the results into the Row:
This will map over the three possibilities in the state, render their corresponding icons in a sized container, and add a GestureDetector to it so that we can know when the user taps on the shape (or when the user makes a guess). For the guess method, we’ll pass the current BuildContext and the name of the shape the user had just tapped on. We’ll look into why the context is needed in a bit, but first, let’s just define a boilerplate void and print out the name of the shape the user tapped:
And we should also create a correctGuess and a lost handler:
void correctGuess(BuildContext context) {
// show snackbar
Scaffold.of(context).showSnackBar(
SnackBar(
backgroundColor: Colors.green,
duration: Duration(seconds: 1),
content: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Icon(
Icons.check,
size: 80,
),
Container(width: 10),
Text(
"Correct!",
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
),
),
],
),
),
);
// add one point, generate new round
setState(() {
points++;
data = generateRound();
});
}
void lost() {
// navigate the user to the lost screen
Navigator.pushNamed(
context,
"/lost",
// pass arguments with this constructor:
arguments: LostScreenArguments(points),
);
// reset the game so that when the user comes back from the "lost" screen,
// a new, fresh round is ready
reset();
}
There’s something special about the correctGuess block: the Scaffold.of(context) will look up the Scaffold widget in the context. However, the context we are currently passing comes from the build(BuildContext context) line, and that context doesn’t contain a Scaffold yet. We can create a new BuildContext by either extracting the widget into another widget (which we won’t be doing now), or by wrapping the widget in a Builder.
So I’ll wrap the Row with the icons in a Builder and I’ll also throw in an Opacity so that the icons have a nice gray color instead of being plain white:
And now, when tapping on the shapes on the bottom, the user will either see a full-screen green snackbar with a check icon and the text “Correct!”, or find themselves on the “Lost” screen. Great! Now, there’s only one thing left before we can call our app a game - drawing the tappable shape on the screen.
Drawing touchable shapes in Flutter
Now that we have the core game logic set up and we have a nice Game screen we can draw on, it’s time to get dirty with drawing on a canvas. Whilst we could use Flutter’s native drawing capabilities, we’d lack a very important feature - interactivity.
Lucky for us, there’s a package that despite having a bit limited drawing capabilities, has support for interactivity - and it’s called touchable. Let’s just add it into our dependencies in the pubspec.yaml:
touchable: any
And now, a few words about how we’re going to achieve drawing shapes. I’ll create some custom painters inside lib/core/shapepainters. They will extend the CustomPainter class that comes from the touchable library. Each of these painters will be responsible for drawing a single shape (e.g. a circle, a line, or a square). I won’t be inserting the code required for all of them inside the article. Instead, you can check it out inside the repository here.
Then, inside the RoundUtilities.dart, we’ll have a method that will return the corresponding painter for the string name of it - e.g. if we pass “circle”, we’ll get the Circle CustomPainter.
We’ll be able to use this method in the Game screen, and we’ll pass the result of this method to the CustomPaint widget coming from the touchable package. This widget will paint the shape on a canvas and add the required interactivity.
Creating a CustomPainter
Let’s get started! First, let’s look at one of the CustomPainters (the other ones only differ in the type of shape they draw on the canvas, so we won’t look into them). First, we’ll initialize an empty CustomPainter with the default methods and two properties, context and onTap:
import 'package:flutter/material.dart';
import 'package:touchable/touchable.dart';
class Square extends CustomPainter {
final BuildContext context;
final Function onTap;
Square(this.context, this.onTap);
@override
void paint(Canvas canvas, Size size) {
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return false;
}
}
We’ll use the context later when creating the canvas, and the onTap will be the tap handler for our shape. Now, inside the paint overridden method, we can create a TouchyCanvas coming from the package:
This will create a simple rectangle. The arguments in the Rect.fromLTRB define the coordinates of the two points between which the rect will be drawn. It’s 0, 0 and width / 1.25, width / 1.25 for our shape - this will fill in the container we created on the Game screen.
We also pass a transparent color (so that the shape is hidden) and an onTapDown, which will just run the onTap property which we pass. Noice!
This is it for drawing our square shape. I created the other CustomPainter classes that we’ll need for drawing a circle, cross, donut, line, oval, and square shapes. You could either try to implement them yourself, or just copy and paste them from the repository here.
Drawing the painter on the screen
Now that our painters are ready, we can move on to the second step: the getPainterForName method. First, I’ll import all the painters into the RoundUtilities.dart:
And then just write a very simple switch statement that will return the corresponding painter for the input string:
dynamic getPainterForName(BuildContext context, Function onTap, String name) {
switch (name) {
case "circle":
return Circle(context, onTap);
case "cross":
return Cross(context, onTap);
case "donut":
return Donut(context, onTap);
case "line":
return Line(context, onTap);
case "oval":
return Oval(context, onTap);
case "square":
return Square(context, onTap);
}
}
And that’s it for the utilities! Now, we can move back into the Game screen and use this getPainterForName utility and the canvas to draw the shapes on the screen:
And that’s it! We only need to create an onShapeTap handler to get all these things working - for now, it’s okay to just throw in a print statement, and we’ll add the haptic feedbacks and the vibrations later on:
void onShapeTap() {
print(
"the user has tapped inside the shape. we should make a gentle haptic feedback!",
);
}
And now, when you tap on the shape inside the blank space, the Flutter CLI will pop up this message in the console. Awesome! We only need to add the haptic feedback, store the high scores, and wrap things up from now on.
Adding haptic feedback and vibration in Flutter
When making mobile applications, you should always aim for designing native experiences on both platforms. That means using different designs for Android and iOS, and using the platform’s native capabilities like Google Pay / Apple Pay or 3D Touch. To be able to think about which designs and experiences feel native on different platforms, you should use both platforms while developing, or at least be able to try out them sometimes.
One of the places where Android and iOS devices differ is how they handle vibrations. While Android has a basic vibration capability, iOS comes with a very extensive haptic feedback engine that enables creating gentle hit-like feedback, with custom intensities, curves, mimicking the 3D Touch effect, tapback and more. It helps the user feel their actions, taps, and gestures, and as a developer, it’s a very nice finishing touch for your app to add some gentle haptic feedback to your app. It will help the user feel your app native and make the overall experience better.
Some places where you can try out this advanced haptic engine on an iPhone (6s or later) are the home screen when 3D Touching an app, the Camera app when taking a photo, the Clock app when picking out an alarm time (or any other carousel picker), some iMessage effects, or on notched iPhones, when opening the app switcher from the bottom bar. Other third party apps also feature gentle physical feedback: for example, the Telegram app makes a nice and gentle haptic feedback when sliding for a reply.
Before moving on with this tutorial, you may want to try out this effect to get a feeling of what we are trying to achieve on iOS - and make sure that you are holding the device in your whole palm so that you can feel the gentle tapbacks.
In our app, we’d like to add these gentle haptic feedbacks in a lot of places: when navigating, making a guess, or, obviously, when tapping inside the shape. On Android, we’ll only leverage the vibration engine when the user taps inside a shape or loses.
And since we’d like to execute different code based on which platform the app is currently running on, we need a way to check the current platform in the runtime. Lucky for us, the dart:io provides us with a Platform API that we can ask if the current platform is iOS or Android. We can use the HapticFeedback API from the flutter/services.dart to call the native haptic feedback and vibration APIs:
// lib/core/HapticUtilities.dart
import 'dart:io' show Platform;
import 'package:flutter/services.dart';
void lightHaptic() {
if (Platform.isIOS) {
HapticFeedback.lightImpact();
}
}
void vibrateHaptic() {
if (Platform.isIOS) {
HapticFeedback.heavyImpact();
} else {
// this will work on most Android devices
HapticFeedback.vibrate();
}
}
And we can now import this file on other screens and use the lightHaptic and vibrateHaptic methods to make haptic feedback for the user that works on both platforms that we’re targeting:
// lib/ui/screens/Game.dart
import '../../core/HapticUtilities.dart'; // ADD THIS LINE
...
void guess(BuildContext context, String name) {
lightHaptic(); // ADD THIS LINE
...
void lost() {
vibrateHaptic(); // ADD THIS LINE
...
Container(
height: width / 1.25,
width: width / 1.25,
child: CanvasTouchDetector(
builder: (context) {
return CustomPaint(
painter: getPainterForName(
context,
vibrateHaptic, // CHANGE THIS LINE
And on the Home and Lost screens:
// Home.dart
// Home.dart
return GestureDetector(
// tapping on empty spaces would not trigger the onTap without this
behavior: HitTestBehavior.opaque,
onTap: () {
// navigate to the game screen
lightHaptic(); // ADD THIS LINE
Navigator.pushNamed(context, "/game");
},
...
// Lost.dart
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
// navigate to the game screen
lightHaptic(); // ADD THIS LINE
Navigator.pop(context);
},
...aaaaand you’re done for iOS! On Android, there’s still a small thing required - you need permission for using the vibration engine, and you can ask for permission from the system in the shapeblinder/android/app/src/main/AndroidManifest.xml:
Now when running the app on a physical device, you’ll feel either the haptic feedback or the vibration, depending on what kind of device you’re using. Isn’t it amazing? You can literally feel your code!
Storing high scores - data persistency in Flutter
There’s just one new feature left before we finish the MVP of this awesome game. The users are now happy - they can feel a sense of accomplishment when they guess right, and they get points, but they can’t really flex with their highest score for their friends as we don’t store them. We should fix this by storing persistent data in Flutter! 💪
To achieve this, we’ll use the shared_preferences package. It can store simple key/value pairs on the device. You should already know what to do with this dependency: go into pubspec.yaml, add it into the deps, wait until VS Code runs the flutter pub get command automatically or run it by yourself, and then restart the current Flutter session by hitting Ctrl + C and running flutter run again.
Now that the shared_preferences package is injected, we can start using it. The package has two methods that we’ll take use of now: .getInt() and .setInt(). This is how we’ll implement them:
We’ll store the high score when the user loses the game
We’ll retrieve it in the Tap widget, and on the Game screen
Let’s get started by storing the high score! Inside the lib/ui/screens/Game.dart, we’ll create two methods: loadHigh and setHigh:
And because we’re displaying the high score in the Logo widget, we’ll want to call setState when the score is updated - so that the widget gets re-rendered with our new data. We’ll also want to call the loadHigh when the screen gets rendered the first time - so that we’re displaying the actual stored high score for the user:
// the initState method is ran by Flutter when the element is first time painted
// it's like componentDidMount in React
@override
void initState() {
reset();
loadHigh(); // ADD THIS
super.initState();
}
And when the user loses, we’ll store the high score:
void lost() {
vibrateHaptic();
// if the score is higher than the current high score,
// update the high score
if (points > high) {
setHigh(points);
}
...
And that’s it for the game screen! We’ll also want to load the high score on the Tap widget, which - currently - is a StatelessWidget. First, let’s refactor the Tap widget into a StatefulWidget by right-clicking on the name of the class, hitting “Refactor…”, and then “Convert to StatefulWidget”.
Then, define the state variables and use the very same methodology we already looked at to load the high score and update the state:
class _TapState extends State<Tap> {
int high = 0;
void loadHigh() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
high = prefs.getInt('high') ?? 0;
});
}
Then, call this loadHigh method inside the build so that the widget is always caught up on the latest new high score:
Oh, and we should also replace the hard-coded “high score: 0”s with the actual variable that represents the high score:
Text(
"best score: $high",
Make sure that you update your code both in the Game and the Tap widgets. We’re all set now with storing and displaying the high score now, so there’s only one thing left:
Summing our Dart and Flutter series up
Congratulations! 🎉 I can’t really explain with words how far we’ve come into the whole Dart and Flutter ecosystem in these three episodes together:
First, we looked at Dart and OOP: We looked at variables, constants, functions, arrays, objects, object-oriented programming, and asynchrony, and compared these concepts to what we’ve seen in JavaScript.
Then, we started with some Flutter theory: We took a peek at the Flutter CLI, project structuring, state management, props, widgets, layouts, rendering lists, theming, and proper networking.
Then we created a pretty amazing game together: We built a cross-platform game from scratch. We mastered the Hero animation, basic concepts about state management, importing third-party dependencies, building multiple screens, navigating, storing persistent data, adding vibration, and more…
I really hope you enjoyed this course! If you have any questions, feel free to reach out in the comments section. It was a lot to take in, but there’s still even more to learn! If you want to stay tuned, subscribe to our newsletter - and make sure that you check out these awesome official Dart and Flutter related resources later on your development journey:
Mon Nov 16 2020 20:20:59 GMT+0700 (Western Indonesia Time)
Вы слышали о функциональном программировании, но не знаете деталей? Готовы ли вы выйти за рамки объектно-ориентированного мышления? Завтра Ник Ходжес , автор книги « Кодирование в Delphi» , научит нас, как использовать методы функционального программирования для создания красивых программ на Delphi. Всего через один день функциональное программирование с помощью Delphi — это разговор, расширяющий знания, который вы не захотите пропустить!
DelphiCon 2020 предлагает десять выступлений и четыре экспертные панели от технических партнеров Embarcadero и самых ценных профессионалов, охватывающих весь спектр программного обеспечения от образования до доступа к промышленным базам данных. Приходите для функционального программирования и уходите с большим пониманием того, как добиться максимальной производительности с помощью Delphi. Конференция бесплатна и открыта для публики. Зарегистрируйтесь сейчас, нажав кнопку «Сохранить мое место» на сайте delphicon.embarcadero.com !
Mon Nov 16 2020 20:20:41 GMT+0700 (Western Indonesia Time)
Você já ouviu falar de programação funcional, mas os detalhes são vagos? Você está pronto para expandir além da mentalidade orientada a objetos? Amanhã, Nick Hodges , autor de Coding in Delphi , nos ensinará como aproveitar as técnicas de programação funcional para criar programas bonitos em Delphi. Em apenas um dia, Functional Programming with Delphi é uma palestra que amplia o conhecimento que você não quer perder!
O DelphiCon 2020 oferece dez palestras e quatro painéis de especialistas por parceiros de tecnologia da Embarcadero e Profissionais Mais Valiosos, abrangendo a gama de software, desde educação até acesso a banco de dados industrial. Venha para a programação funcional e saia com um maior entendimento de como maximizar o desempenho com Delphi. A conferência é gratuita e aberta ao público. Inscreva-se agora clicando no botão “Salvar meu assento” em delphicon.embarcadero.com !
Mon Nov 16 2020 20:19:59 GMT+0700 (Western Indonesia Time)
¿Ha oído hablar de la programación funcional pero no sabe con certeza los detalles? ¿Estás listo para expandirte más allá de la mentalidad orientada a objetos? Mañana, Nick Hodges , autor de Codificación en Delphi , nos enseñará cómo aprovechar las técnicas de programación funcional para crear hermosos programas en Delphi. ¡A solo un día de distancia, Programación funcional con Delphi es una charla de ampliación de conocimientos que no querrá perderse!
DelphiCon 2020 ofrece diez charlas y cuatro paneles de expertos de los socios tecnológicos de Embarcadero y los Profesionales Más Valiosos que abarcan la gama de software desde la educación hasta el acceso a bases de datos industriales. Venga por la programación funcional y salga con una mayor comprensión de cómo maximizar el rendimiento con Delphi. La conferencia es gratuita y abierta al público. ¡Regístrese ahora haciendo clic en el botón “Guardar mi asiento” en delphicon.embarcadero.com !
Mon Nov 16 2020 20:19:37 GMT+0700 (Western Indonesia Time)
Haben Sie von funktionaler Programmierung gehört, sind aber in den Details vage? Sind Sie bereit, über die objektorientierte Denkweise hinaus zu expandieren? Morgen wird uns Nick Hodges , Autor von Coding in Delphi , beibringen, wie man funktionale Programmiertechniken nutzt, um schöne Programme in Delphi zu erstellen. Nur einen Tag entfernt ist Functional Programming mit Delphi ein wissensverbreiternder Vortrag, den Sie nicht missen möchten!
Die DelphiCon 2020 bietet zehn Vorträge und vier Expertengremien von Embarcadero-Technologiepartnern und Most Valuable Professionals, die das gesamte Spektrum der Software von der Ausbildung bis zum Zugriff auf industrielle Datenbanken abdecken. Kommen Sie zur funktionalen Programmierung und lernen Sie besser, wie Sie die Leistung mit Delphi maximieren können. Die Konferenz ist kostenlos und für die Öffentlichkeit zugänglich. Melden Sie sich jetzt an, indem Sie auf delphicon.embarcadero.com auf die Schaltfläche „Sitzplatz speichern“ klicken !
Fri Nov 13 2020 22:26:55 GMT+0700 (Western Indonesia Time)
In den vergangenen Jahren haben wir ein wachsendes Interesse an mobilen Computern festgestellt, die die wachsende Zahl von Fernarbeitern unterstützen, und das Jahr 2020 hat viel Aufmerksamkeit auf diese Geschäftsanwendungen gelenkt. Mitarbeiter arbeiten im Grunde in einem „Büro“, das nur aus einem Laptop oder Smartphone besteht. Von zu Hause, dem Büro eines Kunden oder von anderen entfernten Standorten wird auf das Internet zugegriffen. Allein im Jahr 2020 haben uns die technologischen Möglichkeiten von Geräten, Drahtlos- und Satellitenkommunikation gezeigt, wie man Daten von überall auf der Welt zu jeder Zeit und von jedem beliebigen Gerät aus zugänglich machen kann. Bei jedem Vorhaben, das von einer traditionellen Vor-Ort-Umgebung zu einer Umgebung wechselt, in der mobile Geräte für die Bereitstellung von Ergebnissen genutzt werden kann, treten Probleme auf, die gelöst werden müssen. Sicherheit, TCO, Geschäftsrichtlinien und -praktiken sind immer noch Bereiche, in denen wir verstehen müssen, was für unsere Benutzer erreichbar ist und was nicht, um erfolgreich zu sein. Dies gilt für online Verbindungen, solange die Mitarbeiter arbeiten müssen, bis hin zur Sicherheit von Daten im Ruhezustand und in Bewegung. Mobile Datenbanken sind eine der Optionen, die zur Verfügung stehen, um einige dieser Probleme zu mildern.
Da die Risiken der Datensicherheit eine wachsende Bedrohung darstellen, kann die Suche nach einer mobilen Datenbanklösung, die die erforderlichen Datenschutz- und Compliance-Anforderungen für alle Ihre Plattformen bietet, sichere Backups und sichere Offline-Funktionen bieten. In der Regel stehen weniger Optionen zur Verfügung. Eine dieser verbleibenden Optionen ist InterBase ToGo.
InterBase ToGo ist eine transportable Datenbank, die in Ihre Anwendungen unter Android und iOS sowie unter macOS, Windows und Linux eingebettet werden kann. Mit integrierten Sicherheitsfeauture, sehr geringem Platzbedarf und minimalem Verwaltungsaufwand, können Sie die ToGo Edition einbetten, verteilen und haben keinen weiteren Pfelgeaufwand, da Sie wissen, dass Ihre Benutzer- und Unternehmensdaten sicher und geschützt sind.
InterBase ToGo kann problemlos in Ihre RAD-Anwendungen eingebettet werden. Dies macht es zu einer der besten verfügbaren Optionen für ISVs / VARs, die eine Datenbank benötigen, die die mit der Bereitstellung von Geschäftsanwendungen verbundenen Sicherheitsrisiken verringert. Als VAR ermöglicht die Verwendung einer verschlüsselten Datenbank wie IB ToGo Ihrem Unternehmen, sich auf Ihre Geschäfts- und Benutzeranforderungen zu konzentrieren, indem die Bereitstellungszeit verkürzt und die Sicherheitsstandards eingehalten werden.
Verschlüsselung einrichten
Das Aktivieren der Verschlüsselung mit InterBase ist einfach zu bewerkstelligen, aber schwierig zu knacken.
Finden Ihrer InterBase ToGo-Lizenz
In Ihrer RAD Studio Enterprise and Architect-Lizenz ist eine IBToGo-Lizenz enthalten. Sie finden Ihre Lizenz an folgendem Ort:
Wie oben erwähnt, können Sie InterBase, das in Ihre Anwendungen eingebettet ist, auf mehreren Geräten bereitstellen. Lesen Sie, wie Sie IB ToGo auf einem Android-Smartphone bereitstellen.
Fri Nov 13 2020 22:21:38 GMT+0700 (Western Indonesia Time)
В предыдущие годы мы наблюдали растущий интерес к мобильным вычислениям, которые обеспечивают поддержку растущего числа удаленных сотрудников, и 2020 год привлек большое внимание к этим бизнес-приложениям. Удаленные сотрудники должны работать из «офиса», который на самом деле представляет собой просто ноутбук или смартфон с доступом в Интернет из дома, офиса клиента или других удаленных мест. Только в 2020 году технологические возможности устройств беспроводной и спутниковой связи показали нам, как сделать данные доступными из любой точки мира в любой момент времени с любого типа устройства. При любом переходе с традиционной локальной среды на среду, позволяющую использовать вычислительные мощности телефонов для получения результатов, возникают проблемы, которые необходимо решить для достижения успеха. Безопасность, совокупная стоимость владения, бизнес-рекомендации и практики — все это области, в которых нам нужно понимать, что можно сделать, а что нет для достижения успеха нашими пользователями; от сетевых подключений, пока работникам необходимо работать, до данных в состоянии покоя и безопасности в движении. Мобильные базы данных — это один из способов решения некоторых из этих проблем.
Поскольку риски утечки данных становятся растущей угрозой, при поиске решения для мобильной базы данных, которое предлагает необходимые требования к защите данных и соответствию на всех ваших платформах, может обеспечить защищенное резервное копирование и безопасные автономные возможности, вариантов, как правило, становится меньше. Один из тех вариантов, который все еще остается, — это InterBase ToGo.
InterBase ToGo — это переносимая база данных, предназначенная для встраивания в ваши приложения на Android и iOS, а также в Mac OS, Windows и Linux. Благодаря встроенной системе безопасности, небольшому размеру и минимальному количеству администратора, ToGo позволяет вам встраивать, развертывать и расслабляться, поскольку вы знаете, что ваши пользовательские и корпоративные данные в безопасности.
InterBase ToGo можно легко встроить в ваши приложения RAD, что делает его одним из лучших вариантов для независимых поставщиков программного обеспечения / VAR, которым требуется база данных, которая снижает риски безопасности, связанные с развертыванием бизнес-приложений. В качестве VAR использование зашифрованной базы данных, такой как IB ToGo, позволяет вашему бизнесу сосредоточиться на своем бизнесе и потребностях пользователей за счет сокращения времени развертывания и соблюдения стандартов безопасности.
Настройка шифрования
Включить шифрование с помощью InterBase легко, но сложно взломать.
Как найти вашу лицензию InterBase ToGo
Лицензия IBToGo включена в вашу лицензию на RAD Studio Enterprise и Architect. Вы можете найти свою лицензию по следующему адресу:
Как упоминалось выше, вы можете развернуть InterBase, встроенный в ваши приложения, на нескольких устройствах, узнайте, как развернуть IB ToGo на смартфоне Android.
Fri Nov 13 2020 22:21:20 GMT+0700 (Western Indonesia Time)
Nos anos anteriores, vimos um interesse crescente na computação móvel que fornece suporte para o número crescente de trabalhadores remotos, e 2020 atraiu muita atenção para esses aplicativos de negócios. Os trabalhadores remotos têm os requisitos de trabalhar em um “escritório” que é na verdade apenas um laptop ou smartphone acessando a internet de suas casas, do escritório de um cliente ou de outros locais remotos. Somente em 2020, os recursos de tecnologia dos dispositivos, comunicações sem fio e por satélite nos mostraram como tornar os dados acessíveis de qualquer lugar do mundo a qualquer momento a partir de qualquer tipo de dispositivo. Com qualquer empreendimento que muda de um ambiente local tradicional para um que permite que o poder de computação dos telefones forneça resultados, surgem problemas que precisam ser resolvidos para o sucesso. Segurança, TCO, diretrizes e práticas de negócios ainda são áreas em que precisamos entender o que é e o que não pode ser alcançado para que nossos usuários tenham sucesso; desde conexões online pelo tempo que os funcionários precisarem trabalhar até dados em repouso e segurança em movimento. Os bancos de dados móveis são uma das opções disponíveis para mitigar alguns desses problemas.
Com os riscos de violação de dados uma ameaça crescente, encontrar uma solução de banco de dados móvel que ofereça a proteção de dados e os requisitos de conformidade de que você precisa em todas as suas plataformas, pode fornecer backups protegidos e recursos off-line seguros, tende a haver menos opções disponíveis. Uma das opções que ainda resta é o InterBase ToGo.
O InterBase ToGo é um banco de dados transportável projetado para ser embutido em seus aplicativos Android e iOS, bem como Mac OS, Windows e Linux. Com segurança integrada, uma pequena pegada e um administrador mínimo necessário, o ToGo permite que você incorpore, implante e relaxe, sabendo que seus dados corporativos e de usuário estão protegidos e protegidos.
O InterBase ToGo pode ser facilmente embutido em seus aplicativos RAD, tornando-o uma das melhores opções disponíveis para ISVs / VARs que precisam de um banco de dados que reduza os riscos de segurança associados à implantação de aplicativos de negócios. Como um VAR, o uso de um banco de dados criptografado como o IB ToGo permite que sua empresa se concentre nas necessidades do seu negócio e do usuário, reduzindo o tempo de implantação e mantendo os padrões de conformidade de segurança.
Configurando criptografia
Habilitar a criptografia com o InterBase é fácil de fazer, mas difícil de violar.
Encontrando sua licença InterBase ToGo
Incluída com sua licença RAD Studio Enterprise and Architect está uma licença IBToGo. Você pode encontrar sua licença no seguinte local:
Como mencionado acima, você pode implantar o InterBase embutido em seus aplicativos em vários dispositivos, verifique como implantar o IB ToGo em um smartphone Android.
Fri Nov 13 2020 22:19:56 GMT+0700 (Western Indonesia Time)
En años anteriores, hemos visto un interés creciente en la informática móvil que brinda soporte para el número creciente de trabajadores remotos, y 2020 ha atraído mucha atención a estas aplicaciones comerciales. Los trabajadores remotos tienen los requisitos de trabajar desde una “oficina” que en realidad es solo una computadora portátil o un teléfono inteligente que accede a Internet desde sus hogares, la oficina de un cliente u otras ubicaciones remotas. Solo en 2020, las capacidades tecnológicas de los dispositivos, las comunicaciones inalámbricas y por satélite nos han mostrado cómo hacer que los datos sean accesibles desde cualquier parte del mundo en cualquier momento y desde cualquier tipo de dispositivo. Con cualquier esfuerzo que cambie de un entorno local tradicional a uno que permita que la potencia informática de los teléfonos brinde resultados, surgen problemas que deben resolverse para tener éxito. La seguridad, el TCO, las pautas comerciales y las prácticas siguen siendo áreas en las que debemos comprender qué es y qué no se puede lograr para que nuestros usuarios tengan éxito; desde conexiones en línea durante el tiempo que los trabajadores necesiten trabajar hasta datos en reposo y seguridad en movimiento. Las bases de datos móviles son una de las opciones disponibles para mitigar algunos de estos problemas.
Con el riesgo de violación de datos como una amenaza creciente, encontrar una solución de base de datos móvil que ofrezca la protección de datos y los requisitos de cumplimiento que necesita en todas sus plataformas, puede proporcionar copias de seguridad seguras y capacidades fuera de línea seguras, tiende a haber menos opciones disponibles. Una de esas opciones que aún queda es InterBase ToGo.
InterBase ToGo es una base de datos transportable que está diseñada para integrarse en sus aplicaciones en Android e iOS, así como en Mac OS, Windows y Linux. Con seguridad incorporada, una huella pequeña y un administrador mínimo necesario, ToGo le permite integrar, implementar y relajarse, ya que sabe que sus datos corporativos y de usuario están seguros y protegidos.
InterBase ToGo puede integrarse fácilmente en sus aplicaciones RAD, lo que la convierte en una de las mejores opciones disponibles para los ISV / VAR que necesitan una base de datos que reduzca los riesgos de seguridad asociados con la implementación de aplicaciones comerciales. Como VAR, el uso de una base de datos encriptada como IB ToGo permite que su empresa se concentre en sus necesidades comerciales y de los usuarios al reducir el tiempo de implementación y mantenerse al día con los estándares de cumplimiento de seguridad.
Configurar cifrado
Habilitar el cifrado con InterBase es fácil, pero difícil de acceder.
Encontrar su licencia de InterBase ToGo
Con su licencia RAD Studio Enterprise and Architect se incluye una licencia IBToGo. Puede encontrar su licencia en la siguiente ubicación:
Como se mencionó anteriormente, puede implementar InterBase integrado en sus aplicaciones en varios dispositivos, consulte cómo implementar IB ToGo en un teléfono inteligente Android.
Fri Nov 13 2020 22:11:25 GMT+0700 (Western Indonesia Time)
Beyond Compare ist ein Datenverwaltungsprogramm, mit dem Benutzer Dokumente, Dateien, Ordner und sogar ganze Systemlaufwerke schnell und einfach vergleichen und abgleichen können. Es handelt sich um eine äußerst nützliche Ressource, die mit Delphi erstellt wurde und von Delphi unterstützt wird. Auf der Beyond Compare-Website heißt es: „Sie können ganze Laufwerke und Ordner mit hoher Geschwindigkeit vergleichen und dabei nur die Größe und die Änderungszeiten überprüfen. Oder Sie können jede Datei durch Byte-für-Byte-Vergleiche gründlich überprüfen. FTP-Sites, Cloud-Storage und Zip-Dateien sind nahtlos integriert, und leistungsstarke Filter ermöglichen es Ihnen, die Anzeige auf das zu beschränken, was Sie interessiert. Darüber hinaus bietet es eine Drei-Wege-Zusammenführung, die wie folgt erklärt wird: „Die Zusammenführungsansicht von Beyond Compare ermöglicht es Ihnen, Änderungen von zwei Versionen einer Datei oder eines Ordners in einer einzigen Ausgabe zu kombinieren. Sein intelligenter Ansatz ermöglicht es Ihnen, die meisten Änderungen schnell zu akzeptieren, während Konflikte sorgfältig untersucht werden. Und es bietet die Möglichkeit, Ordner zu synchronisieren, was wie folgt beschrieben wird: „Mit der intuitiven Benutzeroberfläche von Beyond Compare zur Ordnersynchronisierung können Sie Unterschiede in Ihren Daten automatisch abgleichen.
Fri Nov 13 2020 22:11:09 GMT+0700 (Western Indonesia Time)
Beyond Compare es una utilidad de gestión de datos que permite a los usuarios comparar y conciliar documentos, archivos, carpetas e incluso unidades de todo el sistema de forma rápida y sencilla. Es un recurso sumamente útil y está desarrollado y desarrollado por Delphi. Según el sitio web Beyond Compare, “Puede comparar unidades y carpetas completas a alta velocidad, verificando solo los tamaños y los tiempos modificados. O bien, verifique minuciosamente cada archivo con comparaciones byte por byte. Los sitios FTP, el almacenamiento en la nube y los archivos zip están integrados filtros potentes y sin problemas le permiten limitar lo que ve a lo que le interesa “. Además, ofrece una combinación de tres vías que se explica como “La vista de combinación de Beyond Compare le permite combinar cambios de dos versiones de un archivo o carpeta en una única salida. Su enfoque inteligente le permite aceptar rápidamente la mayoría de los cambios mientras examina cuidadosamente los conflictos“. Y ofrece carpetas de sincronización que se describen como “La interfaz intuitiva de sincronización de carpetas de Beyond Compare le permite conciliar las diferencias en sus datos automáticamente“.
Fri Nov 13 2020 22:10:33 GMT+0700 (Western Indonesia Time)
Beyond Compare é um utilitário de gerenciamento de dados que permite aos usuários comparar e reconciliar documentos, arquivos, pastas e até unidades de sistema inteiras de forma rápida e fácil. É um recurso extremamente útil, desenvolvido e desenvolvido pela Delphi. De acordo com o site Beyond Compare “Você pode comparar unidades e pastas inteiras em alta velocidade, verificando apenas os tamanhos e tempos modificados. Ou, verificar completamente cada arquivo com comparações byte a byte. Sites FTP, armazenamento em nuvem e arquivos zip são integrados perfeitamente, e filtros poderosos permitem que você limite o que vê apenas ao que está interessado. ” Além disso, oferece mesclagem de três maneiras, explicada como “A visualização de mesclagem do Beyond Compare permite combinar alterações de duas versões de um arquivo ou pasta em uma única saída. Sua abordagem inteligente permite aceitar rapidamente a maioria das alterações enquanto examina cuidadosamente os conflitos.” E oferece sincronização de pastas que é descrito como “Interface intuitiva de sincronização de pastas do Beyond Compare permite reconciliar diferenças em seus dados automaticamente.“
Fri Nov 13 2020 05:50:10 GMT+0700 (Western Indonesia Time)
This week I had the pleasure to be invited by the INDT (National Institute for Technological Development) in Brazil to participate in a webinar about Artificial Intelligence (in Portuguese).
In the slides and video below, I present several applications of Machine Learning and their impact on our lives, including Recommender Systems and Autonomous Vehicles, with several examples of recent innovations in the fields of Industry, Health and Agriculture.
Thu Nov 12 2020 22:28:20 GMT+0700 (Western Indonesia Time)
Manchmal müssen Sie Komponenten manuell installieren. Möglicherweise wurde das Installationsprogramm für Ihre Delphi-Version nicht aktualisiert, oder es handelt sich um eine Open-Source-Bibliothek ohne Installationsprogramm. Was auch immer der Grund sein mag , hier ist eine kurze Anleitung zusätzlich zu dem, was im DocWiki zu diesem Thema zu finden ist .
Ich werde diesen Leitfaden über die Installation des Radiant Shapes Pack schreiben, das über GetIt erhältlich ist. Ich vermute, es wurde noch nicht für die Installation in 10.4 aktualisiert, und während F & E daran arbeitet, ist dies eine großartige Gelegenheit, um zu lernen, wie man es manuell installiert.
Nach der Installation von GetIt finden Sie es nicht in der IDE und es fehlt in der Paketliste , auf die Sie über Komponente 🡆 Pakete installieren zugreifen, während kein Projekt geöffnet ist
Hier werden alle BPL- Pakete aufgelistet. Klicken Sie auf die Schaltfläche Hinzufügen und suchen Sie nach der BPL
C:Program Files (x86)RaizeRadiantShapes1.4BinRadiantShapesFmx_Design270.bpl (Wenn Sie diese BPL oder diesen Pfad für Radiant Shapes nicht haben, stellen Sie sicher, dass Sie über GetIt installiert haben und das Installationsprogramm manuell ausführen können. C:UsersPublicDocumentsEmbarcaderoStudio21.0CatalogRepositoryRadiantShapes-270-1.2InstallerRadiantShapes.exe)
oder welches Design-Time-Paket Sie auch benötigen. Dadurch werden die Komponenten in der IDE installiert.
Viele Projekte haben sowohl Entwurfszeit- als auch Laufzeitpakete. Ein Design-Time-Paket enthält die Informationen, die für die Installation in der IDE erforderlich sind, sowie alle speziellen Designer, während RunTime-Pakete nur den Code enthalten, der für die Verwendung während RunTime erforderlich ist. Optional können Sie diese Pakete sogar mit Ihrer Binärdatei versenden, um sie zur Laufzeit zu verknüpfen.
Als Nächstes müssen Sie der IDE mitteilen, wo sich die DCUs und optional die Quelldateien befinden. Was ist, wenn Sie nur Quelldateien haben? Kein Problem, öffnen und erstellen Sie alle Pakete mindestens im Release-Modus auf jeder Plattform, die die Bibliothek unterstützt. Dann fahren Sie auf Extras 🡆 Optionen dann Sprache 🡆 Delphi 🡆 Bibliothek .
Vervollständigen Sie dann die Details für jede Plattform, die Sie erstellt haben und die Sie unterstützen möchten:
Ausgewählte Plattform – Gibt an, für welche Plattform Sie unten Details bereitstellen:
Linux 64-Bit, iOS 64-Bit, Win 32-Bit, Win 64-Bit, MacOS 64-Bit, Android 32-Bit, Android 64-Bit und / oder iOS Simulator.
Bibliothekspfad – Dies ist der Pfad zu den Release-DCUs. Einige Leute verweisen hier auf ihre PAS-Dateien, was funktioniert, aber dann kompilieren Sie die Bibliothek mehr als nötig neu.
Radiant Shapes enthält alle DCUs in Unterordnern außerhalb des Pfads C:Program Files (x86)RaizeRadiantShapes1.4Lib
Tipp : Fügen Sie den neuen Pfad in das Bearbeitungsfeld ein, bevor Sie auf die Schaltfläche Durchsuchen klicken, wenn Sie zu einem Unterordner navigieren müssen. Klicken Sie anschließend auf [Hinzufügen], wenn Sie fertig sind.
Dialogfeld „Bibliothekspfade“Speicherort der plattformspezifischen DCU-Ordner für Radiant Shapes C: Programme (x86) Raize RadiantShapes 1.4 Lib
Im Browserpfad können Sie optional einen Pfad zu den PAS-Quelldateien hinzufügen. Auf diese Weise können Sie mit dem Kontextmenüelement “ Deklaration suchen“ aus der IDE zu diesen Quelldateien navigieren.
Für Strahlungsformen befindet sich die Quelle in C:Program Files (x86)RaizeRadiantShapes1.4Source
Mit dem Debug-DCU-Pfad können Sie optional auf die Debug-Version der DCUs verweisen. Dies ist nützlich, wenn die Debug-Version zusätzliche Informationen oder andere Verhaltensweisen enthält.
Radiant Shapes hat keine speziellen Debug-DCUs, daher müssen wir hier nichts hinzufügen.
Sobald Sie diese Einstellungen für jede Plattform vorgenommen haben, können Sie loslegen! Viel Spaß beim Installieren!
Thu Nov 12 2020 22:24:14 GMT+0700 (Western Indonesia Time)
Иногда требуется установить компоненты вручную. Возможно, установщик не был обновлен для вашей версии Delphi, или это библиотека с открытым исходным кодом без установщика. Независимо от причины, вот краткое руководство в дополнение к тому, что можно найти в DocWiki по этой теме.
Я собираюсь написать это руководство по установке пакета Radiant Shapes Pack, доступного через GetIt. Я предполагаю, что он еще не был обновлен для установки в 10.4, и пока R&D работают над этим, это отличная возможность узнать, как установить его вручную.
После установки из GetIt вы не найдете его в IDE, и он отсутствует в списке пакетов, доступ к которому можно получить из Компонент 🡆 Установить пакеты, пока ни один проект не открыт.
Здесь перечислены все пакеты BPL . Нажмите кнопку « Добавить» и найдите BPL.
C:Program Files (x86)RaizeRadiantShapes1.4BinRadiantShapesFmx_Design270.bpl (Если у вас нет этого BPL или пути для Radiant Shapes, убедитесь, что вы установили его из GetIt, и вы можете запустить установщик вручную C:UsersPublicDocumentsEmbarcaderoStudio21.0CatalogRepositoryRadiantShapes-270-1.2InstallerRadiantShapes.exe)
или любой другой пакет времени разработки, который вам нужен. Это установит компоненты в IDE.
У многих проектов есть как пакеты времени разработки, так и пакеты времени исполнения. Пакет времени разработки содержит информацию, необходимую для установки в среде IDE, и любые специальные конструкторы, в то время как пакеты RunTime содержат только код, необходимый для использования во время RunTime. При желании вы даже можете отправить эти пакеты вместе со своим двоичным файлом, чтобы связать их во время выполнения.
Затем вам нужно указать среде IDE, где найти DCU и, при необходимости, исходные файлы. Что делать, если у вас есть только исходные файлы? Нет проблем, откройте и соберите все пакеты хотя бы в режиме выпуска на каждой платформе, которую поддерживает библиотека. Затем перейдите в Инструменты 🡆 Параметры, затем Язык 🡆 Delphi 🡆 Библиотека .
Затем заполните сведения о каждой платформе, которую вы создали и хотите поддерживать:
Выбранная платформа — указывает, для какой платформы вы предоставляете сведения ниже:
64-разрядная версия Linux, 64-разрядная версия iOS, 32-разрядная версия Win, 64-разрядная версия Win, 64-разрядная версия macOS, 32-разрядная версия Android, 64-разрядная версия Android и / или симулятор iOS.
Путь к библиотеке — это путь к DCU выпуска. Некоторые люди указывают здесь на свои файлы PAS, что работает, но в конечном итоге вы перекомпилируете библиотеку больше, чем необходимо.
Radiant Shapes включает все DCU в подпапках вне пути. C:Program Files (x86)RaizeRadiantShapes1.4Lib
Совет : вставьте новый путь в поле редактирования, прежде чем нажимать кнопку обзора, если вам нужно перейти к подпапке. Затем не забудьте нажать [Добавить], когда закончите.
Диалог путей к библиотекеРасположение папок DCU для платформы Radiant Shapes C: Program Files (x86) Raize RadiantShapes 1.4 Lib
Путь просмотра — это место, где вы при желании можете добавить путь к исходным файлам PAS. Это позволяет вам переходить к этим исходным файлам из среды IDE с помощью пункта контекстного меню « Найти декларацию» .
Источник сияющих форм находится в C:Program Files (x86)RaizeRadiantShapes1.4Source
Путь отладки DCU позволяет вам дополнительно указать на отладочную версию DCU. Это полезно, если отладочная версия содержит дополнительную информацию или другое поведение.
В Radiant Shapes нет специальных отладочных DCU, поэтому нам не нужно здесь ничего добавлять.
После того, как вы завершили эти настройки для каждой платформы, все готово! Удачной установки!
Thu Nov 12 2020 22:23:56 GMT+0700 (Western Indonesia Time)
Às vezes, você precisa instalar componentes manualmente. Talvez o instalador não tenha sido atualizado para sua versão do Delphi, ou é uma biblioteca de código aberto sem um instalador. Seja qual for o motivo, aqui está um pequeno guia além do que é encontrado no DocWiki sobre o assunto.
Vou escrever este guia sobre a instalação do Radiant Shapes Pack disponível via GetIt. Suponho que ainda não foi atualizado para instalar na versão 10.4 e, enquanto o P&D está trabalhando, esta é uma grande oportunidade de aprender como instalá-lo manualmente.
Depois de instalar a partir do GetIt, você não o encontrará no IDE e está faltando na lista de pacotes, que você acessa em Componente 🡆 Instalar Pacotes enquanto nenhum projeto estiver aberto
É aqui que todos os pacotes BPL são listados. Clique no botão Adicionar e navegue para encontrar o BPL
C:Program Files (x86)RaizeRadiantShapes1.4BinRadiantShapesFmx_Design270.bpl (Se você não tiver esse BPL ou caminho para Radiant Shapes, certifique-se de que instalou a partir do GetIt e pode executar o instalador manualmente C:UsersPublicDocumentsEmbarcaderoStudio21.0CatalogRepositoryRadiantShapes-270-1.2InstallerRadiantShapes.exe)
ou qualquer pacote de tempo de design de que você precisa. Isso instalará os componentes no IDE.
Muitos projetos têm pacotes de tempo de design e tempo de execução. Um pacote de tempo de design contém as informações necessárias para instalar no IDE e quaisquer designers especiais, enquanto os pacotes de tempo de execução contêm apenas o código necessário para uso durante o tempo de execução. Você pode, opcionalmente, até mesmo enviar esses pacotes com seu binário para vinculá-los em tempo de execução.
Em seguida, você precisa informar ao IDE onde encontrar as DCUs e, opcionalmente, os arquivos de origem. E se você tiver apenas arquivos de origem? Não tem problema, abra e construa todos os pacotes pelo menos no modo de lançamento em cada plataforma que a biblioteca suporta. Em seguida, vá para Tools then Options e Language 🡆 Delphi 🡆 Library .
Em seguida, preencha os detalhes de cada plataforma que você construiu e deseja oferecer suporte:
Plataforma selecionada – especifica para qual plataforma você está fornecendo detalhes:
Linux 64 bits, iOS 64 bits, Win 32 bits, Win 64 bits, macOS 64 bits, Android 32 bits, Android 64 bits e / ou simulador iOS.
Caminho da biblioteca – este é o caminho para as DCUs de lançamento. Algumas pessoas apontam para seus arquivos PAS aqui, o que funciona, mas então você acaba recompilando a biblioteca mais do que o necessário.
Radiant Shapes inclui todas as DCUs em subpastas fora do caminho C:Program Files (x86)RaizeRadiantShapes1.4Lib
Dica : cole o novo caminho na caixa de edição antes de clicar no botão de navegação, se precisar navegar até uma subpasta. Em seguida, certifique-se de clicar em [Adicionar] quando terminar.
Diálogo de caminhos da bibliotecaLocalização das pastas DCU específicas da plataforma para Radiant Shapes C: Arquivos de programas (x86) Raize RadiantShapes 1.4 Lib
Caminho de navegação é onde você opcionalmente adiciona um caminho para os arquivos PAS de origem. Isso permite que você navegue até esses arquivos de origem do IDE com o item de menu de contexto Encontrar declaração .
Para Radiant Shapes, a fonte é encontrada em C:Program Files (x86)RaizeRadiantShapes1.4Source
Caminho de depuração DCU permite que você opcionalmente aponte para a versão de depuração das DCUs. Isso é útil se a versão de depuração tiver informações adicionais ou comportamentos diferentes.
Radiant Shapes não possui DCUs de depuração especiais, portanto, não precisamos adicionar nada aqui.
Depois de concluir essas configurações para cada plataforma, você está pronto para começar! Boa instalação!
Thu Nov 12 2020 22:21:53 GMT+0700 (Western Indonesia Time)
A veces es necesario instalar componentes manualmente. Quizás el instalador no se actualizó para su versión de Delphi o es una biblioteca de código abierto sin un instalador. Cualquiera sea la razón, aquí hay una breve guía además de lo que se encuentra en DocWiki sobre el tema.
Voy a escribir esta guía sobre la instalación del Radiant Shapes Pack disponible a través de GetIt. Supongo que aún no se actualizó para instalarlo en 10.4, y mientras I + D está trabajando en eso, esta es una gran oportunidad para aprender a instalarlo manualmente.
Después de instalar desde GetIt, no lo encontrará en el IDE y no se encuentra en la lista de paquetes, a la que accede desde Componente 🡆 Instalar paquetes mientras no hay ningún proyecto abierto
Aquí es donde se enumeran todos los paquetes BPL . Haga clic en el botón Agregar y busque la BPL
C:Program Files (x86)RaizeRadiantShapes1.4BinRadiantShapesFmx_Design270.bpl (Si no tiene ese BPL o ruta para Radiant Shapes, asegúrese de instalar desde GetIt y puede ejecutar el instalador manualmente desde C:UsersPublicDocumentsEmbarcaderoStudio21.0CatalogRepositoryRadiantShapes-270-1.2InstallerRadiantShapes.exe)
o cualquier paquete de tiempo de diseño que necesite. Esto instalará los componentes en el IDE.
Muchos proyectos tienen paquetes de tiempo de diseño y tiempo de ejecución. Un paquete en tiempo de diseño contiene la información necesaria para instalar en el IDE y cualquier diseñador especial, mientras que los paquetes RunTime solo contienen el código necesario para su uso durante RunTime. Opcionalmente, incluso puede enviar estos paquetes con su binario para vincularlos en tiempo de ejecución.
A continuación, debe indicarle al IDE dónde encontrar las DCU y, opcionalmente, los archivos de origen. ¿Qué pasa si solo tiene archivos fuente? No hay problema, abra y compile todos los paquetes al menos en modo de lanzamiento en cada plataforma que admita la biblioteca. Luego dirígete a Herramientas 🡆 Opciones y luego Idioma 🡆 Delphi 🡆 Biblioteca .
Luego, complete los detalles de cada plataforma que creó y desea admitir:
Plataforma seleccionada : especifica la plataforma para la que proporciona detalles a continuación:
Linux de 64 bits, iOS de 64 bits, Win de 32 bits, Win de 64 bits, macOS de 64 bits, Android de 32 bits, Android de 64 bits y / o simulador de iOS.
Ruta de la biblioteca : esta es la ruta a las DCU de versión. Algunas personas señalan sus archivos PAS aquí, lo que funciona, pero luego terminas compilando la biblioteca más de lo necesario.
Radiant Shapes incluye todas las DCU en subcarpetas fuera de la ruta C:Program Files (x86)RaizeRadiantShapes1.4Lib
Consejo : Pegue la nueva ruta en el cuadro de edición antes de hacer clic en el botón Examinar si necesita buscar una subcarpeta. Luego, asegúrese de hacer clic en [Agregar] cuando haya terminado.
Diálogo Rutas de bibliotecaUbicación de las carpetas DCU específicas de la plataforma para Radiant Shapes C: Archivos de programa (x86) Raize RadiantShapes 1.4 Lib
Ruta de navegación es donde, opcionalmente, agrega una ruta a los archivos PAS de origen. Esto le permite buscar esos archivos de origen desde el IDE con el elemento del menú contextual Buscar declaración .
Para Radiant Shapes, la fuente se encuentra en C:Program Files (x86)RaizeRadiantShapes1.4Source
Debug DCU Path le permite apuntar opcionalmente a la versión de depuración de las DCU. Esto es útil si la versión de depuración tiene información adicional o comportamientos diferentes.
Radiant Shapes no tiene DCU de depuración especiales, por lo que no es necesario agregar nada aquí.
Una vez que haya completado esta configuración para cada plataforma, ¡estará listo! ¡Feliz instalación!
Wed Nov 11 2020 22:29:09 GMT+0700 (Western Indonesia Time)
Sind Sie Lehrer, Erzieher oder Elternteil eines Kindes, das sich für Programmierung interessiert? Suchen Sie eine einfache, aber leistungsstarke Sprache und eine schülerfreundliche integrierte Entwicklungsumgebung? Mit seiner Kombination aus vollsprachigen Funktionen, einfacher Syntax und visueller Drag-and-Drop-Entwicklung rockt Delphi seine Konkurrenz. Immer noch unsicher? Lassen Sie sich von Victory Fernandes , einem ehemaligen Professor für Mathematik und Informatik an der brasilianischen Unifacs University, in seinem Vortrag Delphi an der Universität – Einblicke für Schüler und Lehrer durch die Vorteile von Delphi in der Bildung führen . Diese Präsentation und Q & A-Sitzung ist kostenlos und wird mit neun weiteren Vorträgen und vier Panels von Branchenfachleuten gebündelt. Melden Sie sich jetzt an, indem Sie auf delphicon.embarcadero.com auf die Schaltfläche „Sitzplatz speichern“ klicken.
Wed Nov 11 2020 22:25:34 GMT+0700 (Western Indonesia Time)
Вы учитель, педагог или родитель ребенка, интересующегося программированием? Вы ищете простой, но мощный язык и удобную для студентов интегрированную среду разработки? Благодаря сочетанию полноязычных функций, простого синтаксиса и визуальной разработки методом перетаскивания Delphi составляет конкуренцию. Все еще не уверены? Позвольте Виктори Фернандесу, бывшему профессору математики и информатики в бразильском университете Unifacs, рассказать вам о преимуществах Delphi в образовании в своем выступлении Delphi в университете — Insights for Student and Teachers. Эта презентация и сессия вопросов и ответов бесплатны и сопровождаются девятью другими докладами и четырьмя панелями профессионалов отрасли. Зарегистрируйтесь сейчас, нажав кнопку «Сохранить мое место» на сайте delphicon.embarcadero.com.
Wed Nov 11 2020 22:25:19 GMT+0700 (Western Indonesia Time)
Você é professor, educador ou pai de uma criança interessada em programação? Você está procurando uma linguagem simples, mas poderosa, e um ambiente de desenvolvimento integrado amigável ao aluno? Com sua combinação de recursos de linguagem completa, sintaxe simples e desenvolvimento visual de arrastar e soltar, o Delphi arrasa com sua concorrência. Ainda não tem certeza? Deixe Victory Fernandes, ex-professora de matemática e ciência da computação da Universidade Unifacs do Brasil, mostrar os benefícios da Delphi na educação em sua palestra Delphi na Universidade – Insights para alunos e professores. Esta apresentação e sessão de perguntas e respostas são gratuitas e acompanhadas por nove outras palestras e quatro painéis por profissionais da indústria. Inscreva-se agora clicando no botão “Salvar meu assento” em delphicon.embarcadero.com.
Wed Nov 11 2020 22:24:38 GMT+0700 (Western Indonesia Time)
¿Eres profesor, educador o padre de un niño interesado en la programación? ¿Está buscando un lenguaje simple pero poderoso y un entorno de desarrollo integrado amigable para los estudiantes? Con su combinación de características de lenguaje completo, sintaxis simple y desarrollo visual de arrastrar y soltar, Delphi es una gran competencia. ¿Aún no estás seguro? Deje que Victory Fernandes, ex profesora de matemáticas y ciencias de la computación en la Universidad Unifacs de Brasil, lo guíe a través de los beneficios de Delphi en la educación en su charla Delphi en la Universidad – Perspectivas para estudiantes y profesores. Esta presentación y sesión de preguntas y respuestas es gratuita y se combina con otras nueve charlas y cuatro paneles de profesionales de la industria. Regístrese ahora haciendo clic en el botón “Guardar mi asiento” en delphicon.embarcadero.com.
Wed Nov 11 2020 22:21:41 GMT+0700 (Western Indonesia Time)
Haben Sie jemals auf Ihrem Mobilgerät auf eine Website zugegriffen und festgestellt, dass diese für den Desktop formatiert und auf einem 5-Zoll-Bildschirm nahezu unlesbar ist? Ähnliche Probleme treten bei Benutzern mit hochauflösenden Bildschirmen auf. Da sich 4K-Bildschirme vermehren und der Verbraucherdruck für 8K zunimmt, ist es wichtig, die Benutzeroberflächen anzupassen, um zu verhindern, dass Formulare und Steuerelemente auf hochauflösenden Monitoren unlesbar klein werden. RAD Studio 10.3 Rio und Rio Update 2 haben erweiterte Steuerelemente für hochauflösende Anwendungen eingeführt, um dieses Problem zu beheben. Ray Konopka von Raize Software, Inc. ist hier, um uns beizubringen, wie wir ihre Vorteile maximieren können. Nur noch sieben Tage, Nutzung von High DPI in VCL-Anwendungen ist ein Muss für alle Entwickler, Hobbyisten und RAD Studio-Enthusiasten, die nach neuen Techniken suchen, um in unserer sich verändernden Softwarelandschaft relevant zu bleiben.
DelphiCon 2020 biedt tien lezingen en vier expertpanels door technische partners van Embarcadero en Most Valuable Professionals, die het scala aan software omvat, van onderwijs tot industriële databasetoegang. Kom voor de High-DPI-kennis en vertrek met een beter begrip van Delphi-webapplicaties. De conferentie is gratis en open voor het publiek. Schrijf u nu in door op de knop „Mijn stoel opslaan“ te klikken op delphicon.embarcadero.com!
Wed Nov 11 2020 22:10:19 GMT+0700 (Western Indonesia Time)
Beyond Compare — это утилита управления данными, которая позволяет пользователям быстро и легко сравнивать и согласовывать документы, файлы, папки и даже целые системные диски. Это очень полезный ресурс, созданный и поддерживаемый Delphi. Согласно веб-сайту Beyond Compare: «Вы можете сравнивать диски и папки целиком на высокой скорости, проверяя только размеры и время изменения. Или тщательно проверяйте каждый файл с помощью побайтного сравнения. FTP-сайты, облачное хранилище и zip-файлы интегрированы без проблем, а мощные фильтры позволяют ограничить то, что вы видите, только тем, что вам интересно «. Кроме того, он предлагает трехстороннее слияние, которое объясняется следующим образом: «Представление слияния Beyond Compare позволяет вам объединять изменения из двух версий файла или папки в один выходной файл. Его интеллектуальный подход позволяет вам быстро принять большинство изменений при тщательном изучении конфликтов». И он предлагает синхронизацию папок, которая описывается как «интуитивно понятный интерфейс синхронизации папок Beyond Compare позволяет автоматически согласовывать различия в ваших данных».
Wed Nov 11 2020 22:10:06 GMT+0700 (Western Indonesia Time)
Der Entwickler Ivan Polyacov von Apus Software hat Astral Heroes in Delphi erstellt. Laut der Website ist es ein Sammelkartenspiel, das einfach zu erlernen, spannend zu spielen und tief genug ist, um selbst die größten Strategen herauszufordern. Es verwendet ein wirklich faires Free-to-Play-Modell, das laut dem Entwickler niemals die besten Inhalte hinter „Bezahlwänden“ versteckt. Einige der Merkmale dieses schönen Spiels sind Schnelles und einfaches Kern-Gameplay, 3 verschiedene Spielmodi, benutzerdefinierte Decks: Konstruieren und spielen Sie ein Deck nach Ihrem persönlichen Entwurf, Zufallsdecks, Draft-Turnier, eine umfangreiche Bibliothek gut ausgewogener Kreaturen und Zaubersprüche, eine globale Online-Liga, raffinierte und gnadenlose KI-Gegner, die Ihren Mut auf die Probe stellen, und eine reichhaltige Einzelspieler-Kampagne. Wenn Sie mehr darüber erfahren möchten, warum Ivan sich für Delphi entschieden hat, und mehr über diesen Entwicklungsprozess erfahren möchten, sehen Sie sich dieses YouTube-Video zur Überprüfung des Codes an.
Wed Nov 11 2020 22:09:47 GMT+0700 (Western Indonesia Time)
El desarrollador Ivan Polyacov de Apus Software creó Astral Heroes en Delphi. Según el sitio, es un juego de cartas coleccionables que es fácil de aprender, emocionante de jugar y lo suficientemente profundo como para desafiar incluso a los mejores estrategas. Utiliza un modelo Free-to-Play verdaderamente justo que nunca esconde el mejor contenido detrás de “muros de pago” según el desarrollador. Algunas de las características de este hermoso juego incluyen: Juego básico de ritmo rápido y simple, 3 modos de juego diferentes, Decks personalizados: construye y juega un mazo de tu propio diseño personal, Decks aleatorios, Draft Tournament, una biblioteca profunda de criaturas bien equilibradas y hechizos, una liga en línea global, oponentes de IA sofisticados y despiadados que pondrán a prueba tu temple y una rica campaña para un jugador. Si desea obtener más información sobre por qué Ivan seleccionó Delphi y más sobre este proceso de desarrollo, consulte este video de revisión de código de YouTube.
Wed Nov 11 2020 22:09:12 GMT+0700 (Western Indonesia Time)
O desenvolvedor Ivan Polyacov da Apus Software criou Astral Heroes em Delphi. De acordo com o site, é um jogo de cartas colecionável que é simples de aprender, emocionante de jogar e profundo o suficiente para desafiar até mesmo os maiores estrategistas. Ele usa um modelo Free-to-Play verdadeiramente justo que nunca esconde o melhor conteúdo atrás de “paredes de pagamento” de acordo com o desenvolvedor. Alguns dos recursos deste belo jogo incluem: jogabilidade simples e rápida, 3 modos de jogo diferentes, Decks personalizados: construa e jogue um deck de seu próprio projeto, Decks aleatórios, Torneio Draft, uma biblioteca profunda de criaturas bem equilibradas e feitiços, uma liga online global, oponentes de IA sofisticados e impiedosos que testarão sua coragem e uma rica campanha para um jogador. Se você quiser saber mais sobre por que Ivan escolheu Delphi e mais sobre este processo de desenvolvimento, confira este vídeo de revisão de código do YouTube.
Wed Nov 11 2020 22:08:48 GMT+0700 (Western Indonesia Time)
Разработчик Иван Поляков из Apus Software создал Astral Heroes в Delphi. Согласно сайту, это коллекционная карточная игра, которая проста в освоении, увлекательна и достаточно глубока, чтобы бросить вызов даже самым великим стратегам. Он использует по-настоящему честную модель Free-to-Play, которая, по словам разработчика, никогда не скрывает лучший контент за «платными стенами». Некоторые из особенностей этой красивой игры включают в себя: динамичный и простой основной игровой процесс, 3 различных режима игры, пользовательские колоды: собирайте и играйте в колоду собственного дизайна, случайные колоды, турнир по драфту, обширную библиотеку хорошо сбалансированных существ. и заклинания, глобальная онлайн-лига, изощренные и безжалостные противники искусственного интеллекта, которые испытают ваш характер, и насыщенная одиночная кампания. Если вы хотите узнать больше о том, почему Иван выбрал Delphi, и больше об этом процессе разработки, посмотрите это видео с обзором кода YouTube.
Tue Nov 10 2020 22:08:31 GMT+0700 (Western Indonesia Time)
Entwickler Michal Mutl vom MiTeC verfügt über ein leistungsfähiges, erweitertes Task-Manager-Dienstprogramm, das in Delphi erstellt wurde. Die Funktionen in diesem erweiterten Task-Manager machen ihn zu einem der fortschrittlichsten Task-Manager für Windows, die ich je gesehen habe. Es gibt hier so viele Funktionen, dass es unglaublich ist. Laut Funktionsliste bietet Task Manager Deluxe (TMX) Echtzeitbeobachtung von: laufenden Prozessen, installierten Diensten und Treibern, verfügbaren Netzwerkadaptern, Netzwerkverbindungen nach Prozess, Netzwerkverkehr, Festplatten- und E/A-Auslastung, aktiven Terminalsitzungen, Autostarteinträgen, CPU-Auslastung, Häufigkeit und anderen erweiterten Statistiken, CPU-Auslastung und Auslastung der CPU-Engines, Speicherzuordnung und -auslastung, Systeminformationen, Finder für geöffnete/gesperrte Dateien, Maschinenjournal, Benutzerkontenliste, Monitor-Layout-Ansicht und verfügbare Fenster-Updates. Dies ist ein großartiges Beispiel für eine native Delphi-Anwendung und die Geschwindigkeit und Leistung, die eine native Anwendung zu einer Lösung bringen kann. Außerdem verfügt es sowohl über einen hellen als auch einen dunklen Modus, was eine nette Geste ist (und in Delphi super einfach ist)!
Tue Nov 10 2020 22:08:13 GMT+0700 (Western Indonesia Time)
El desarrollador Michal Mutl con MiTeC tiene una poderosa utilidad mejorada de administrador de tareas disponible que está integrada en Delphi. Las características de este administrador de tareas mejorado lo convierten en uno de los administradores de tareas para Windows más avanzados que he visto. Hay tantas características aquí que es increíble. De acuerdo con la lista de funciones, Task Manager Deluxe (TMX) proporciona observación en tiempo real de: procesos en ejecución, servicios y controladores instalados, adaptadores de red disponibles, conexiones de red por proceso, tráfico de red, uso de disco y E / S, sesiones de terminal activas, inicio automático entradas, uso de CPU, frecuencia y otras estadísticas avanzadas, uso de gpu y uso de motores de gpu, mapa y utilización de memoria, información del sistema, buscador de archivos abiertos / bloqueados, diario de la máquina, lista de cuentas de usuario, vista de diseño del monitor y actualizaciones disponibles de Windows. Este es un gran ejemplo de una aplicación nativa de Delphi y la velocidad y potencia que una aplicación nativa puede aportar a una solución. También cuenta con modos claros y oscuros, lo cual es un toque agradable (y muy fácil en Delphi).
Tue Nov 10 2020 22:07:34 GMT+0700 (Western Indonesia Time)
O desenvolvedor Michal Mutl com MiTeC possui um poderoso utilitário de gerenciamento de tarefas aprimorado disponível, que é construído em Delphi. Os recursos deste gerenciador de tarefas aprimorado o tornam um dos gerenciadores de tarefas mais avançados para Windows que já vi. Existem tantos recursos aqui que é incrível. De acordo com a lista de recursos, o Task Manager Deluxe (TMX) fornece observação em tempo real de: processos em execução, serviços e drivers instalados, adaptadores de rede disponíveis, conexões de rede por processo, tráfego de rede, utilização de disco e I / O, sessões de terminal ativas, inicialização automática entradas, uso de cpu, frequência e outras estatísticas avançadas, uso de gpu e uso de motores de gpu, mapa e utilização de memória, informações do sistema, localizador de arquivos abertos / bloqueados, diário de máquina, lista de contas de usuário, exibição de layout do monitor e atualizações disponíveis de janelas. Este é um ótimo exemplo de um aplicativo Delphi nativo e da velocidade e poder que um aplicativo nativo pode trazer para uma solução. Ele também possui os modos claro e escuro, o que é um toque agradável (e super fácil no Delphi)!
Tue Nov 10 2020 22:07:10 GMT+0700 (Western Indonesia Time)
Разработчик Michal Mutl с MiTeC имеет мощную расширенную утилиту диспетчера задач, встроенную в Delphi. Функции этого расширенного диспетчера задач делают его одним из самых продвинутых диспетчеров задач для Windows, которые я когда-либо видел. Здесь так много возможностей, что это просто невероятно. В соответствии со списком функций Task Manager Deluxe (TMX) обеспечивает наблюдение в реальном времени за: запущенными процессами, установленными службами и драйверами, доступными сетевыми адаптерами, сетевыми соединениями по процессам, сетевым трафиком, использованием диска и ввода-вывода, активными сеансами терминала, автозапуском. записи, использование процессора, частота и другая расширенная статистика, использование графического процессора и использование графических процессоров, карта и использование памяти, системная информация, поиск открытых / заблокированных файлов, машинный журнал, список учетных записей пользователей, представление макета монитора и доступные обновления Windows. Это отличный пример собственного приложения Delphi, а также скорости и мощности, которые собственное приложение может привнести в решение. Он также имеет светлый и темный режимы, что очень приятно (и очень просто в Delphi)!
Mon Nov 09 2020 22:56:15 GMT+0700 (Western Indonesia Time)
Embarcadero hat gerade einen neuen Patch für RAD Studio 10.4.1 veröffentlicht. Dies umfasst Verbesserungen des Delphi-Compilers und des Delphi-LSP. Der Patch ist in GetIt verfügbar, und auf der Begrüßungsseite der RAD Studio-IDE sollte die Verfügbarkeit angegeben werden. Der Patch wird auch im Download-Portal der Kunden von my.embarcadero.com verfügbar sein. Lesen Sie weiter, um mehr über diesen Patch und die beiden GetIt-Pakete zu erfahren.
Delphi Compiler und Code Completion Patch
This patch addresses two issues in the Delphi 10.4.1 compiler: a data layout issue with specific alignments, logged in Quality Portal as RSP-30890 and RSP-30787, and a performance issue when recompiling, logged as RSP-22074, RSP-30714, and RSP-30627. The performance improvement provided in this patch also helps with performance for Code Insight when using the LSP server.
The patch comes in two packages. The first includes updated compilers for all platforms available in Delphi and RAD Studio Professional. The second package includes the Linux compiler and it is available only for Enterprise customers. Delphi and RAD Studio Enterprise customers should see and install both packages (the order doesn’t really matter, as they are independent).
Jedes dieser GetIt-Pakete ist ein verzögertes Paket. Dies bedeutet, dass Sie es auswählen. Der eigentliche Download und die Installation erfolgen jedoch, wenn Sie die RAD Studio-IDE schließen, da sie die von der IDE verwendeten Dateien ersetzt. Befolgen Sie einfach die Schritte, warten Sie, bis die GetItCmd-Konsolen-App den Vorgang ausgeführt hat, und beachten Sie, dass die in Ihren RAD Studio-Installationsordnern ersetzten Dateien in ein spezielles Sicherungsverzeichnis unter dem Hauptinstallationsverzeichnis kopiert werden.
Im folgenden Screenshot sehen Sie einen der Schritte des automatischen Installationsprozesses:
Nach der verzögerten Installation wird RAD Studio neu gestartet und der Patch wird im Dialogfeld „GetIt Package Manager“ und auf der Begrüßungsseite als installiert angezeigt. Unternehmensbenutzer müssen beide Pakete installieren, damit die Benachrichtigung über die Begrüßungsseite nicht mehr angezeigt wird.
Mon Nov 09 2020 22:29:39 GMT+0700 (Western Indonesia Time)
DevOps und RAD Studio
DevOps ist ein Begriff, den ich während eines Kundengesprächs immer häufiger höre, und ich teile häufig die verschiedenen Arten, wie Delphi, C ++ Builder und RAD Studio-Programmierung DevOps unterstützen. (Lesen Sie weiter – kostenlose Infografik unten)
Der Begriff DevOps stammt aus der Zeit um 2008/09, als die beiden Welten Entwicklung und Betrieb traditionell Stereotypen als Dev V Ops waren, mit typischen Austauschen wie „Es sind nicht meine Maschinen, es ist Ihr Code!“. – „Nein, es ist nicht mein Code, es sind deine Maschinen!“ Diese Stereotypen wurden aus Reibung aufgebaut, die in den wichtigsten Geschäftsanforderungen für fast jedes System zu finden ist – Änderungen vornehmen! Die Fähigkeit, schnell Änderungen vorzunehmen, ist wichtig, wenn Sie der Konkurrenz einen Schritt voraus sein möchten.
RAD-Entwickler sind es gewohnt, agil zu entwickeln und Änderungen schnell zu erstellen. Um sie jedoch bereitzustellen, sind Vorgänge erforderlich. Das Vornehmen von Änderungen birgt für das Operations-Team ein hohes Ausfallrisiko. Dies verhindert jedoch, dass Innovationen rechtzeitig vorangetrieben werden. Dieser Konflikt ist etwas, das DevOps anerkennt und versucht, durch neue Arbeitsweisen, die beide Seiten näher zusammenbringen, zusammenzubrechen.
Im Laufe der Jahre mussten die beiden Welten Dev und Ops anfangen, einander ähnlicher zu denken, einschließlich der Frage, wie man Feedback von Live-Umgebungen erhält, um Probleme zu finden, die im Code erscheinen. Agile und DevOps verwenden und erweitern sie gerne wieder. Anstatt einen vollständigen Kommentar dazu abzugeben, wie RAD Studio heute Delphi- und C ++ Builder-Entwickler unterstützt, möchte ich es einfach halten und sagen, dass die Bibliotheken, Komponenten, Toolchains (und mehr) ) in RAD Studio und unserem breiteren Partner-Ökosystem bieten sowohl Entwicklern als auch Betriebsteams umfassende Unterstützung, die kommunizieren und teilen müssen, was vor Ort geschieht.
Die komponentenbasierte Architektur und die plattformübergreifenden Bibliotheken, die systemübergreifend arbeiten, sind der perfekte Grundstein für eine schnelle, agile Entwicklung, die einfach unterstützt werden kann. Aber schließlich sagt ein Bild mehr als tausend Worte. Dies ist nur eine Momentaufnahme des RAD-Ökosystems, es gibt zu viel, um hier alles anzulegen, aber ich hoffe, dies gibt einen Eindruck von nur der Spitze des Eisbergs und wie die RAD Studio-IDE sowie Delphi und C + + Builder-Sprachen und -Bibliotheken ermöglichen Entwicklungsteams auf der ganzen Welt, DevOps heute zu unterstützen.
Mon Nov 09 2020 21:56:56 GMT+0700 (Western Indonesia Time)
Embarcadero только что выпустил новый патч для RAD Studio 10.4.1. Сюда входят улучшения компилятора Delphi и улучшения Delphi LSP. Патч доступен в GetIt, и на приветственной странице RAD Studio IDE должна быть указана его доступность. Патч также будет доступен на портале загрузки для клиентов my.embarcadero.com. Читайте дальше, чтобы узнать больше об этом патче и двух пакетах GetIt для его доставки.
Компилятор Delphi и патч завершения кода
Этот патч устраняет две проблемы в компиляторе Delphi 10.4.1: проблему компоновки данных с определенными выравниваниями, регистрируемую в портале качества как RSP-30890 и RSP-30787, и проблему производительности при перекомпиляции, регистрируемую как RSP-22074, RSP-30714 , и RSP-30627. Улучшение производительности, представленное в этом патче, также помогает повысить производительность Code Insight при использовании LSP-сервера.
Патч поставляется в двух пакетах. Первый включает обновленные компиляторы для всех платформ, доступных в Delphi и RAD Studio Professional. Второй пакет включает компилятор Linux и доступен только для корпоративных клиентов. Клиенты Delphi и RAD Studio Enterprise должны увидеть и установить оба пакета (порядок не имеет значения, поскольку они независимы).
Каждый из этих пакетов GetIt является отложенным пакетом, что означает, что вы выбираете его, но фактическая загрузка и установка происходит, когда вы закрываете RAD Studio IDE, поскольку он заменяет файлы, используемые IDE. Просто следуйте инструкциям, подождите, пока консольное приложение GetItCmd выполнит процесс, и обратите внимание, что файлы, замененные в ваших установочных папках RAD Studio, копируются в специальный каталог резервных копий в основном месте установки.
На снимке экрана ниже показан один из этапов автоматической установки:
После отложенной установки RAD Studio перезагрузится, и исправление будет отображаться как установленное в диалоговом окне GetIt Package Manager и на странице приветствия. Корпоративным пользователям необходимо будет установить оба пакета, чтобы уведомление о приветственной странице исчезло.
Mon Nov 09 2020 21:56:42 GMT+0700 (Western Indonesia Time)
A Embarcadero acaba de lançar um novo patch para RAD Studio 10.4.1. Isso inclui melhorias no compilador Delphi e melhorias no Delphi LSP. O patch está disponível no GetIt e a página de boas-vindas do RAD Studio IDE deve indicar sua disponibilidade. O patch também estará disponível no portal de download de clientes my.embarcadero.com. Continue lendo para aprender mais sobre este patch e os dois pacotes GetIt para distribuí-lo.
Compilador Delphi e patch de conclusão de código
Este patch aborda dois problemas no compilador Delphi 10.4.1: um problema de layout de dados com alinhamentos específicos, registrado no Portal da Qualidade como RSP-30890 e RSP-30787, e um problema de desempenho ao recompilar, registrado como RSP-22074, RSP-30714 e RSP-30627. A melhoria de desempenho fornecida neste patch também ajuda no desempenho do Code Insight ao usar o servidor LSP.
O patch vem em dois pacotes. O primeiro inclui compiladores atualizados para todas as plataformas disponíveis em Delphi e RAD Studio Professional. O segundo pacote inclui o compilador Linux e está disponível apenas para clientes Enterprise. Os clientes Delphi e RAD Studio Enterprise devem ver e instalar os dois pacotes (o pedido realmente não importa, pois eles são independentes).
Cada um desses pacotes GetIt é um pacote adiado, o que significa que você o seleciona, mas o download e a instalação reais ocorrem quando você fecha o RAD Studio IDE, pois ele substitui os arquivos usados pelo IDE. Basta seguir as etapas, esperar que o aplicativo de console GetItCmd execute o processo e observe que os arquivos substituídos nas pastas de instalação do RAD Studio são copiados em um diretório de backup especial no local de instalação principal.
Veja a captura de tela abaixo para uma das etapas do processo de instalação automática:
Após a instalação adiada, o RAD Studio será reinicializado e o patch aparecerá como instalado na caixa de diálogo Gerenciador de pacotes GetIt e na página de boas-vindas. Os usuários corporativos terão que instalar os dois pacotes para ver a notificação da página de boas-vindas desaparecer.
Mon Nov 09 2020 21:56:04 GMT+0700 (Western Indonesia Time)
Embarcadero acaba de lanzar un nuevo parche para RAD Studio 10.4.1. Esto incluye mejoras del compilador de Delphi y mejoras de Delphi LSP. El parche está disponible en GetIt y la página de bienvenida de RAD Studio IDE debe indicar su disponibilidad. El parche también estará disponible en el portal de descargas de clientes my.embarcadero.com. Siga leyendo para obtener más información sobre este parche y los dos paquetes GetIt para entregarlo.
Compilador Delphi y parche de finalización de código
Este parche aborda dos problemas en el compilador de Delphi 10.4.1: un problema de diseño de datos con alineaciones específicas, registrado en Quality Portal como RSP-30890 y RSP-30787, y un problema de rendimiento al recompilar, registrado como RSP-22074, RSP-30714 y RSP-30627. La mejora de rendimiento proporcionada en este parche también ayuda con el rendimiento de Code Insight cuando se usa el servidor LSP.
El parche viene en dos paquetes. El primero incluye compiladores actualizados para todas las plataformas disponibles en Delphi y RAD Studio Professional. El segundo paquete incluye el compilador de Linux y está disponible solo para clientes empresariales. Los clientes de Delphi y RAD Studio Enterprise deben ver e instalar ambos paquetes (el orden realmente no importa, ya que son independientes).
Cada uno de estos paquetes GetIt es un paquete diferido, lo que significa que lo selecciona, pero la descarga e instalación reales se llevan a cabo cuando cierra el IDE de RAD Studio, ya que reemplaza los archivos que usa el IDE. Simplemente siga los pasos, espere a que la aplicación de consola GetItCmd realice el proceso y observe que los archivos reemplazados en las carpetas de instalación de RAD Studio se copian en un directorio de respaldo especial en la ubicación de instalación principal.
Vea la captura de pantalla a continuación para ver uno de los pasos del proceso de instalación automática:
Después de la instalación diferida, RAD Studio se reiniciará y el parche se mostrará como instalado en el cuadro de diálogo GetIt Package Manager y en la página de bienvenida. Los usuarios empresariales tendrán que instalar ambos paquetes para que desaparezca la notificación de la página de bienvenida.
Mon Nov 09 2020 21:55:45 GMT+0700 (Western Indonesia Time)
DevOps и RAD Studio
DevOps — это термин, который я слышу все чаще и чаще во время разговоров с клиентами, и я часто рассказываю о различных способах, которыми программирование Delphi, C ++ Builder и RAD Studio поддерживает DevOps. (Продолжайте читать — бесплатная инфографика ниже)
Термин DevOps восходит к 2008/9 году, когда два мира разработки и эксплуатации были традиционно стереотипными, как Dev V Ops, с типичными обменами типа «Это не мои машины, это ваш код!» — «Нет, это не мой код, это твои машины!». Эти стереотипы были построены на трении, обнаруженном в ключевом бизнес-требовании практически для любой системы — внесении изменений! Способность быстро вносить изменения важна, если вы хотите опережать конкурентов.
Разработчики RAD привыкли к гибкой разработке и могут быстро вносить изменения, однако для их развертывания необходимы операции. Для группы эксплуатации внесение изменений сопряжено с высоким риском сбоя, но это препятствует своевременному внедрению инноваций. DevOps признает этот конфликт и пытается разрешить его с помощью новых методов работы, которые сближают обе стороны.
За прошедшие годы двум мирам Dev и Ops пришлось начать думать больше друг о друге, в том числе о том, как получить обратную связь от реальных сред, чтобы найти проблемы, которые появляются в коде. Agile и DevOps любят повторно использовать и расширять, поэтому вместо того, чтобы давать развернутые комментарии о том, как RAD Studio поддерживает разработчиков Delphi и C ++ Builder сегодня, позвольте мне упростить и сказать, что библиотеки, компоненты, инструментальные средства (и многое другое ), присутствующие в RAD Studio, и нашей более широкой партнерской экосистеме, обеспечивают широкую поддержку как разработчикам, так и командам эксплуатации, которым необходимо общаться и делиться тем, что происходит на местах.
Компонентная архитектура и кроссплатформенные библиотеки, которые работают в нескольких системах, являются идеальным фундаментом для быстрой гибкой разработки, которую можно легко поддерживать. Но в конце концов картина рисует тысячу слов. Это всего лишь моментальный снимок экосистемы RAD, здесь слишком много, чтобы все на нем разместить, но я надеюсь, что это дает представление только о верхушке айсберга и о том, как RAD Studio IDE, Delphi и C + + Языки и библиотеки Builder позволяют командам разработчиков по всему миру поддерживать DevOps уже сегодня.
Mon Nov 09 2020 21:55:30 GMT+0700 (Western Indonesia Time)
DevOps e RAD Studio
DevOps é um termo que ouço cada vez mais durante as conversas com os clientes e frequentemente compartilho as diferentes maneiras como a programação do Delphi, C ++ Builder e RAD Studio oferece suporte ao DevOps. (Continue lendo – infográfico gratuito abaixo)
O termo DevOps se originou por volta de 2008/9, quando os dois mundos de Desenvolvimento e Operações eram tradicionalmente estereótipos como Dev V Ops, com trocas típicas como “Não são minhas máquinas, é o seu código!” – “Não, não é meu código, são suas máquinas!”. Esses estereótipos foram construídos a partir do atrito encontrado nos principais requisitos de negócios para quase todos os sistemas – fazer mudanças! A capacidade de fazer alterações rapidamente é importante se você quiser ficar à frente da concorrência.
Os desenvolvedores RAD estão acostumados com o desenvolvimento ágil e sendo capazes de criar mudanças rapidamente, no entanto, colocá-las em implantação precisa de Operações. Para a equipe de operações, fazer alterações traz um alto risco de interrupção, mas isso impede que as inovações sejam implementadas em tempo hábil. Esse conflito é algo que o DevOps reconhece e tenta eliminar por meio de novas formas de trabalho que aproximam os dois lados.
Ao longo dos anos, os dois mundos de Dev e Ops tiveram que começar a pensar mais como um ao outro, incluindo, como obter feedback de ambientes ativos para encontrar problemas que aparecem no código. Agile e DevOps gostam de reutilizar e expandir, então, em vez de fornecer um comentário completo sobre como o RAD Studio oferece suporte aos desenvolvedores Delphi e C ++ Builder hoje, deixe-me mantê-lo simples e dizer que as bibliotecas, componentes, conjuntos de ferramentas (e mais ) encontrados no RAD Studio, e em nosso ecossistema de parceiros mais amplo, fornecem amplo suporte para equipes de desenvolvedores e operações que precisam se comunicar e compartilhar o que está acontecendo no campo.
A arquitetura baseada em componentes e as bibliotecas de plataforma cruzada que funcionam em vários sistemas são a pedra fundamental perfeita para um desenvolvimento ágil rápido, que pode ser suportado de forma simples. Mas, finalmente, uma imagem vale mais que mil palavras. Este é apenas um instantâneo do ecossistema RAD, há muito para colocar tudo aqui, mas espero que isso dê um gostinho de apenas a ponta do iceberg e como o RAD Studio IDE, e o Delphi e C + + Linguagens e bibliotecas de builder estão permitindo que equipes de desenvolvimento em todo o mundo ofereçam suporte ao DevOps hoje.
Mon Nov 09 2020 21:54:59 GMT+0700 (Western Indonesia Time)
DevOps y RAD Studio
DevOps es un término que escucho cada vez más en las conversaciones con los clientes y, a menudo, comparto las diferentes formas en que Delphi, C ++ Builder y RAD Studio dan soporte a la programación de DevOps. (Sigue leyendo – infografía gratuita a continuación)
El término DevOps se remonta aproximadamente a 2008/9, cuando los dos mundos de Desarrollo y Operaciones eran tradicionalmente estereotipos como Dev V Ops, con intercambios típicos como “¡No son mis máquinas, es tu código!” – “No, no es mi código, son tus máquinas”. Estos estereotipos surgieron de la fricción que se encuentra en los requisitos comerciales más importantes para casi cualquier sistema: ¡hacer cambios! La capacidad de realizar cambios rápidamente es importante si desea mantenerse por delante de la competencia.
Los desarrolladores de RAD están acostumbrados al desarrollo ágil y pueden realizar cambios rápidamente, pero su implementación requiere Operaciones. Para el equipo de operaciones, implementar cambios conlleva un alto riesgo de interrupciones, pero esto evita que las innovaciones se impulsen de manera oportuna. Este conflicto es algo que DevOps reconoce y trata de superar con nuevas formas de trabajo que acerquen a ambas partes.
A lo largo de los años, los dos mundos de Dev y Ops han tenido que pensar más como el otro, incluido cómo obtener comentarios de entornos en vivo para encontrar problemas que ocurren en el código. A Agile y DevOps les encanta reutilizar y expandirse, por lo que en lugar de comentar por completo cómo RAD Studio es compatible con los desarrolladores de Delphi y C ++ Builder en la actualidad, quiero mantenerlo simple y decir las bibliotecas, componentes, cadenas de herramientas (y más) que se encuentran en RAD Studio y nuestro ecosistema de socios más amplio, brindan un amplio soporte tanto a los desarrolladores como a los equipos de operaciones que necesitan comunicarse y compartir lo que está sucediendo en el campo.
La arquitectura basada en componentes y las bibliotecas multiplataforma que funcionan en varios sistemas proporcionan la base perfecta para un desarrollo rápido y flexible que se puede admitir fácilmente. Pero al final una imagen dice más que mil palabras. Esta es solo una instantánea del ecosistema RAD, hay demasiado para poner todo aquí, pero espero que esto le dé una idea de la punta del iceberg, y cómo el IDE de RAD Studio, y Delphi y C ++ Los lenguajes y bibliotecas de constructores permiten a los equipos de desarrollo de todo el mundo admitir DevOps hoy.
Mon Nov 09 2020 12:45:51 GMT+0700 (Western Indonesia Time)
Vor einigen Tagen haben wir die Installationsdateien für die RAD Server Installation optimiert. Einer Installation steht damit auch unter neueren Windows Versionen (mit dem korrespondierendem IIS 10; Internet Information Server, der WebServer von Microsoft) nichts mehr im Wege. Man sollte nur einige Punkte beachten.
Eine RAD Studio (Delphi / C++Builder) IDE (installiert, um Zugriff auf das GetIt Paket zu haben; dazu gleich mehr)
Ein Windows System, auf dem der IIS installiert werden soll (hier: Ein separates Windows Server 2019)
Eine RAD Server Seriennummer
Internetzugang auf dem Produktionsrechner
Anleitung
Zuerst installiert man auf dem Zielsystem den IIS. Innerhalb von Windows 2019 über den Server-Manager: Während der Installation (mit den Grundpaketen des IIS; also inkl IIS Verwaltungskonsole) müssen auch die ISAPI-Erweiterungen installiert werden (findet man während der Installation unter Rollendienste / Anwendungsentwicklung):
Man kann kurz den IIS testen, ob dieser läuft: Standardwebsite sollte das bekannte Bild liefern:
Danach besorgt man sich im RAD Studio (Delphi und/oder C++Builder) die Installationspakete für den RAD Server. Diese befinden sich im GetIt Paketmanager (Tools | GetIt-Package-Manager). Unter dem Stickwort (Suchfeld) „RAD Server“ sollte folgendes erscheinen:
Hier lädt man sich das Installerpaket herunter. Dieses Installerpaket beinhaltet zwei Dinge: Die eigentliche RAD Server Installation (für IIS, Apache; inklusive den notwendigen BPLs, DLLs für eine Grundinstallation) und ein InterBase 2020 (für die Konfigurationsdaten des RAD Servers). Nach dem Download des Pakets „RAD Server Installer for Windows 1.0“ öffnet sich der Windows (Datei) Explorer und zeigt die heruntergeladenen Dateien an (Verzeichnis C:\Users\<UserName>\Documents\Embarcadero\Studio\21.0\CatalogRepository\RADServerInstallerforWindows-104-1.0):
NB: Lassen Sie sich nicht von der Versionsnummer „1.0“ irritieren. Dieses Paket wurde in letzter Zeit häufiger/regelmäßig aktualisiert. Stand heute: Dateidatum 22. August 2020
Aus diesem Verzeichnis kopiert man (per FTP, File-Sharing, USB Stick, …..) die zwei Dateien auf das Zielsystem:
RADServer.exe
InterBase_2020_Windows.zip
Diese beiden Dateien beinhalten alles Notwendige für die Installation auf dem Windows Server und sollen auf dem Zielsystem in ein gemeinsames Verzeichnis kopiert werden. Hier auf dem Desktop:
Man startet die RADServer.exe. Diese Installation ist relativ simpel durchzuführen. Einige Punkte gibt es aber zu beachten:
Minimal muss „RAD Server DB (InterBase 2020)“ und „RAD Server“ installiert werden. Eine vollständige Installation ist zu empfehlen
Die Architektur (32/64 Bit) sollte man auf 64 Bit auswählen (der IIS unterstützt zwar auch das Ausführen von 32 Bit ISAPI-DLLs; dies erfordert aber Konfigurationsaufwand)
Webserver: Hier IIS (logisch)
Standardverzeichnis: C:\inetpub\RADServer
Sitenamen radserver / radconsole (spiegelt den Teil der URL wieder, über den man seine Endpoints erreicht)
Sitename (für die Konfiguration innerhalb der IIS Verwaltung: RAD Server / Port 80)
Der Port 80 kollidiert natürlich erstmal mit der Standardsite vom IIS. Dazu später mehr
Die Installation installiert nun einen InterBase 2020 Server, der aktiviert werden muss. Dies sollte man unbedingt schon jetzt durchführen (die Installationsroutine „RADServer.exe“ konfiguriert auch alle notwendigen Einstellungen für die EMSServer.ini, den InterBase Server etc. Dazu ist es notwendig, daß der InterBase Server auch schon läuft!)
Im Hintergrund sieht man den Registrierungsexperten, wo man seinen RASD Server aktiviert/lizensiert. Ich wiederhole es gerne: Hier einen RAD Server Key angeben; kein RAD Studio, kein Delphi, keinen normalen InterBase Key:
Registrieren -> Seriennummer angeben
Erfolg:
Den Registrierungsexperten schliessen („OK“)
Hier kann man dann beherzt „Continue“ auswählen….
Während der weiteren Installation kommen zwei Fehlermeldungen / Hinweise, die aber nicht dramatisch sind:
Hier hat man eine schöne Möglichkeit (man soll ja das Positive sehen), um zu überprüfen, ob der InterBase Server läuft. Über den „InterBase Server Manager“ aus dem Start-Menü von Windows sollte dieser als „Running“ dargestellt werden. Die Fehlermeldung bestätigt man mit „Yes to All“.
Für alle, die es interessiert (Optional): Bevor man die Installation abschliesst, finden sich die ausgeführten PowerScript Befehle im %TEMP% Verzeichnis. Hier ist es das Verzeichnis C:\Users\Administrator\AppData\Local\Temp\I1604922298\InstallerData\Disk1\InstData\Resource1.zip\$IA_PROJECT_DIR$). Interessant sind hier zwei Dateien (für IIS): RADServer_IIS_Config.ps1 und RADConsole_IIS_Config.ps1. Ich hab diese hier mal dargestellt.
#Parameters from command line
param (
[string]$SiteName,
[string]$Port,
[string]$RootPath,
[string]$SiteDirectory,
[string]$Architecture,
[string]$INIFilePath,
[string]$SelectedFeatures
)
function Set-OrAddIniValue
{
Param(
[string]$FilePath,
[hashtable]$keyValueList
)
$content = Get-Content $FilePath
$keyValueList.GetEnumerator() | ForEach-Object {
if ($content -match "^$($_.Key)=")
{
$content= $content -replace "^$($_.Key)=(.*)", "$($_.Key)=$($_.Value)"
}
else
{
$content += "$($_.Key)=$($_.Value)"
}
}
$content | Set-Content $FilePath
}
#Variables used for creating iis modules
$DriveSitePath = $SiteDirectory
$AppPool = $RootPath
$IISEMSPath = 'IIS:\sites\' + $SiteName + '\' + $RootPath
$DriveEMSPath = $DriveSitePath + '\' + $RootPath
$DLLPath = $DriveEMSPath + "\EMSServer.dll"
$WebAppName = $RootPath
$INIFile = $INIFilePath
function Set-SwaggerValue
{
Param(
[string]$FilePath
)
$content = Get-Content $FilePath
$replaceContent = 'url: "/'+$RootPath+'/EMSServer.dll/API/APIDoc.json",'
$content= $content -replace 'url: "../API/APIDoc.json",', $replaceContent
$content | Set-Content $FilePath
}
#needed for apppool check
import-module webadministration
#check if website exists with the same site name
if(!(Test-Path IIS:\AppPools\$AppPool))
{
#app pool doesn't exist
if ((Test-Path $IISEMSPath) -and ($DriveSitePath.Contains('inetpub\wwwroot')))
{
$AppPool = "DefaultAppPool"
}
else
{
#website doesn't exist
#Create an application pool and website
New-WebAppPool -Name $AppPool
New-WebSite -Name $SiteName -Port $Port -PhysicalPath $DriveSitePath -ApplicationPool $AppPool
}
}
# Allow EMS website to override server-wide handler configurations
Set-WebConfiguration //System.webServer/handlers -metadata overrideMode -value Allow -PSPath IIS:/ -verbose
# Allow execute permissions for the EMS handler
Set-WebConfiguration -filter "/system.webServer/handlers/@AccessPolicy" -PSPath $IISEMSPath -value "Read, Script, Execute" -verbose
# Set up the EMS handler
Set-WebHandler -Name "ISAPI-dll" -Path "*.dll" -PSPath $IISEMSPath -RequiredAccess Execute -ScriptProcessor $DLLPath -ResourceType File -Modules IsapiModule -Verb '*'
# Create the EMS web app
New-WebApplication -Name $WebAppName -Site $SiteName -PhysicalPath $DriveEMSPath -ApplicationPool $AppPool -force
# Add exception to ISAPI and CGI Restrictions
Add-WebConfiguration -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/security/isapiCgiRestriction" -value @{description='EMSServerRestriction';path=$DLLPath;allowed='True'}
#check if 32 bit mode was selected
if ($Architecture -contains '32Bit')
{
# Enable 32-bit applications
set-itemProperty IIS:\apppools\$AppPool -name "enable32BitAppOnWin64" -Value "true"
}
else
{
set-itemProperty IIS:\apppools\$AppPool -name "enable32BitAppOnWin64" -Value "false"
}
if ($SelectedFeatures -match 'SUI')
{
$SiteDirectory = $SiteDirectory.Replace('\', '\\')
$SwaggeruiDir=$SiteDirectory+'\\swaggerui'
$PublicPaths='{"path": "swaggerui", "directory": "' + $SwaggeruiDir + '", "default": "index.html", "extensions": ["js", "html", "css", "map", "png"], "charset": "utf-8"}'
Set-OrAddIniValue -FilePath $INIFile -keyValueList @{
swaggerui=$PublicPaths
}
$SwaggeruiDir= $SwaggeruiDir.Replace("\\", "\") + "\index.html"
Set-SwaggerValue -FilePath $SwaggeruiDir
}
RADConsole_IIS_Config.ps1
#Parameters from command line
param (
[string]$SiteName,
[string]$Port,
[string]$RootPath,
[string]$SiteDirectory,
[string]$Architecture,
[string]$INIFilePath,
[string]$SelectedFeatures
)
#This is used to search the ini file and update it to include the correct location for the resources folder
function Set-OrAddIniValue
{
Param(
[string]$FilePath,
[hashtable]$keyValueList
)
$content = Get-Content $FilePath
$keyValueList.GetEnumerator() | ForEach-Object {
if ($content -match "^$($_.Key)=")
{
$content= $content -replace "^$($_.Key)=(.*)", "$($_.Key)=$($_.Value)"
}
else
{
$content += "$($_.Key)=$($_.Value)"
}
}
$content | Set-Content $FilePath
}
#Variables used for creating iis modules
$DriveSitePath = $SiteDirectory
$AppPool = $RootPath
$IISEMSPath = 'IIS:\sites\' + $SiteName + '\' + $RootPath
$DriveEMSPath = $DriveSitePath + '\' + $RootPath
$DLLPath = $DriveEMSPath + "\EMSConsole.dll"
$WebAppName = $RootPath
$INIFile = $INIFilePath
#needed for apppool check
import-module webadministration
#check if website exists with the same site name
if(!(Test-Path IIS:\AppPools\$AppPool))
{
#app pool doesn't exist
if ((Test-Path $IISEMSPath) -and ($DriveSitePath.Contains('inetpub\wwwroot')))
{
$AppPool = "DefaultAppPool"
}
else
{
#website doesn't exist
#Create an application pool and website
New-WebAppPool -Name $AppPool
New-WebSite -Name $SiteName -Port $Port -PhysicalPath $DriveSitePath -ApplicationPool $AppPool
}
}
# Allow EMS website to override server-wide handler configurations
Set-WebConfiguration //System.webServer/handlers -metadata overrideMode -value Allow -PSPath IIS:/ -verbose
# Allow execute permissions for the EMS handler
Set-WebConfiguration -filter "/system.webServer/handlers/@AccessPolicy" -PSPath $IISEMSPath -value "Read, Script, Execute" -verbose
# Set up the EMS handler
Set-WebHandler -Name "ISAPI-dll" -Path "*.dll" -PSPath $IISEMSPath -RequiredAccess Execute -ScriptProcessor $DLLPath -ResourceType File -Modules IsapiModule -Verb '*'
# Create the EMS web app
New-WebApplication -Name $WebAppName -Site $SiteName -PhysicalPath $DriveEMSPath -ApplicationPool $AppPool -force
# Add exception to ISAPI and CGI Restrictions
Add-WebConfiguration -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/security/isapiCgiRestriction" -value @{description='EMSConsoleRestriction';path=$DLLPath;allowed='True'}
#check if 32 bit mode was selected
if ($Architecture -contains '32Bit')
{
# Enable 32-bit applications
set-itemProperty IIS:\apppools\$AppPool -name "enable32BitAppOnWin64" -Value "true"
}
else
{
set-itemProperty IIS:\apppools\$AppPool -name "enable32BitAppOnWin64" -Value "false"
}
# Optional: Allow CORS
Add-WebConfigurationProperty //system.webServer/httpProtocol/customHeaders $IISEMSPath -AtIndex 0 -Name collection -Value @{name='Access-Control-Allow-Origin';value='*'}
#Modify emserver.ini to include resources directory
Set-OrAddIniValue -FilePath $INIFile -keyValueList @{
ResourcesFiles=$DriveEMSPath
}
if ($SelectedFeatures -match 'SUI')
{
if ($SelectedFeatures -match 'RS')
{
$SiteDirectory = $SiteDirectory.Replace('\', '\\')
$SwaggeruiDir=$SiteDirectory+'\\swaggerui'
$PublicPaths='{"path": "swaggerui", "directory": "' + $SwaggeruiDir + '", "default": "index.html", "extensions": ["js", "html", "css", "map", "png"], "charset": "utf-8"}'
Set-OrAddIniValue -FilePath $INIFile -keyValueList @{
swaggerui=$PublicPaths
}
}
}
#Copy the ini file from the public documents directory to the radconsole directory
#Copy-Item $INIFile -Destination $DriveEMSPath
Nach dem endgültigem Abschluss der Installation sollte der Server schon (fast!) laufen
Wir erinnern uns (wenn so angegeben): Die Site läuft auf dem Port 80, wo auch die Standardsite vom IIS läuft. Wir schalten also die Standardsite ab (je nach Wunsch / Konfiguration) und starten die „RAD Server Site“: Das geht im IIS Manager. Hier also die Standardsite („Default Web Site“) stoppen und dafür die „RAD Server“ Site starten:
Anschliessend sollte folgender Aufruf funktionieren (Internet Explorer; auf dem Zielsystem direkt):
http://localhost/radserver/emsserver.dll
Oder auch
http://localhost/radserver/emsserver.dll/version
Der Internet Explorer weiß aber nix von JSON Dateien:
Auch das kann man ihm abgewöhnen (optional!). Eine Datei mit der Endung REG:
Windows Registry Editor Version 5.00
;
; Tell IE to open JSON documents in the browser.
; 25336920-03F9-11cf-8FD0-00AA00686F13 is the CLSID for the "Browse in place" .
;
[HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00
[HKEY_CLASSES_ROOT\MIME\Database\Content Type\text/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00
Das klappt’s auch mit dem IE:
Eigentlich war es das „schon“..
Bemerkungen:
Die RADServer.exe Installation hat auch eine EMSServer.ini Datei hier abgelegt und konfiguriert:
„C:\Users\Public\Documents\Embarcadero\EMS\emsserver.ini“
Hier sind auch die wichtigsten Konfig-Parameter richtig gesetzt
Wo die Datei liegt, steht in der Regsitry:
HKEY_LOCAL_MACHINE\SOFTWARE\Embarcadero\EMS
Eigene BPLs können natürlich irgendwo im Dateisystem stehen; brauchen aber dann eventuell auch noch einen Rattenschwanz an weiteren DLLs/BPLs
Zum Testen kann man einfach seine erste BPL (Standard-RAD-Server-Beispiel) in der EMSSERVER.INI angeben:
Abschnitt [Server.Packages]
Manchmal kommt es vor, daß die RAD Server Console (http://localhost/radconsole/emsconsole.dll) nur ein LOADING angibt:
Lösung: Einmal die „C:\inetpub\RADServer\radconsole\EMSDevConsole.exe“ aufrufen. Einloggen (consoleuser/consolepass). Dann geht’s (über den Port 8081 und dann auch über den normalen Port 80)
Anschliessend über den normalen Port 80:
Fri Nov 06 2020 22:06:54 GMT+0700 (Western Indonesia Time)
ImageLab ist ein natives Windows-basiertes Multisensor-Bildgebungswerkzeug zur Verarbeitung und Analyse hyperspektraler Bilder, das in Delphi erstellt wurde. Es zielt auf die Forschung in Wissenschaft und Technik ab, bei der spektral aufgelöste Bilder verwendet werden. Laut dem Entwickler „bietet ImageLab Multi-Sensor-Unterstützung für hyperspektrale Bildgebung. Dies ermöglicht es Forschern, Informationen aus spektral aufgelösten Bildern zu extrahieren, die auf andere Weise nicht gewonnen werden können. ImageLab unterstützt eine lange Liste spektroskopischer Methoden (d.h. UVVIS, Infrarot, Raman, energiedispersives Röntgen, THz, Massenspektroskopie und mehr) und wird in einem breiten Spektrum von Anwendungen eingesetzt (z.B. zum Nachweis von Partikeln in der Luft, zum Scannen von Gewebe auf Krebszellen, zum Aufdecken ultrafeiner Risse in Stahl und mehr). Trotz der schieren Größe der Anwendung (ca. 750.000 Zeilen Delphi-Code) wurde diese neue und einzigartige Anwendung innerhalb von 5 Jahren von Grund auf neu entwickelt (dank RAD Studio und der SDL Component Suite)„.
Fri Nov 06 2020 22:06:40 GMT+0700 (Western Indonesia Time)
ImageLab es una herramienta de generación de imágenes multisensor nativa basada en Windows para procesar y analizar imágenes hiperespectrales integradas en Delphi. Se dirige a la investigación en ciencia y tecnología donde se utilizan imágenes resueltas espectralmente. Según el desarrollador, “ImageLab proporciona soporte multisensor para imágenes hiperespectrales. Esto permite a los investigadores extraer información de imágenes resueltas espectralmente que no se pueden obtener de otra manera. ImageLab admite una larga lista de métodos espectroscópicos (es decir, uvvis, infrarrojos, Raman, rayos x de dispersión de energía , THz, espectroscopia de masas y más) y se utiliza en una amplia gama de aplicaciones (p. Ej., Detección de partículas en el aire, escaneo de tejido en busca de células cancerosas, descubrimiento de grietas ultrafinas en acero y más) .A pesar del gran tamaño de la aplicación (aprox. 750.000 líneas de código Delphi) esta nueva y única aplicación ha sido desarrollada en 5 años desde cero (gracias a RAD Studio y SDL Component Suite) “.
Fri Nov 06 2020 22:06:06 GMT+0700 (Western Indonesia Time)
ImageLab é uma ferramenta de imagem multi-sensor nativa baseada em Windows para processar e analisar imagens hiperespectrais construídas em Delphi. Destina-se a pesquisas em ciência e tecnologia onde imagens espectralmente resolvidas são utilizadas. De acordo com o desenvolvedor, “ImageLab fornece suporte multissensor para imagens hiperespectrais. Isso permite aos pesquisadores extrair informações de imagens espectralmente resolvidas que não podem ser obtidas de outra forma. ImageLab oferece suporte a uma longa lista de métodos espectroscópicos (ou seja, uvvis, infravermelho, Raman, raio X de dispersão de energia , THz, espectroscopia de massa e muito mais) e é usado em uma ampla gama de aplicações (por exemplo, detecção de partículas no ar, varredura de tecido em busca de células cancerosas, descoberta de fissuras ultrafinas em aço e muito mais). Apesar do tamanho da aplicação (aprox. 750.000 linhas de código Delphi), este aplicativo novo e exclusivo foi desenvolvido em 5 anos do zero (graças ao RAD Studio e ao SDL Component Suite). “
Thu Nov 05 2020 22:05:41 GMT+0700 (Western Indonesia Time)
ImageLab — это родной инструмент для создания мультисенсорных изображений на базе Windows для обработки и анализа гиперспектральных изображений, созданных в Delphi. Он нацелен на исследования в области науки и техники, в которых используются изображения со спектральным разрешением. По словам разработчика, «ImageLab обеспечивает поддержку нескольких датчиков для гиперспектральной визуализации. Это позволяет исследователям извлекать информацию из изображений со спектральным разрешением, которые нельзя получить иным способом. ImageLab поддерживает длинный список спектроскопических методов (например, УФ-ВИД, инфракрасный, Рамановский, энергодисперсионный рентгеновский снимок). , ТГц, масс-спектроскопия и др.) И используется в широком спектре приложений (например, обнаружение частиц в воздухе, сканирование тканей на предмет раковых клеток, обнаружение ультратонких трещин в стали и т. Д.). 750 000 строк кода Delphi) это новое уникальное приложение было разработано с нуля в течение 5 лет (благодаря RAD Studio и SDL Component Suite) ».
Thu Nov 05 2020 22:05:21 GMT+0700 (Western Indonesia Time)
Der Entwickler Tore Ottinsen sagte über seine App Orbit Xplorer: „Ich bin ein pensionierter Physiklehrer an einer High School und ein Hobby-Delphi-Programmierer. Dies ist meine neueste Physik-App, geschrieben in FMX für Windows. Ich hoffe, bald eine Mac-Version zu erstellen.“ Es ist ein gutes Beispiel dafür, wie zugänglich Delphi als IDE und Object Pascal als Programmiersprache ist. Laut der Website ist „Orbit Xplorer ein einfach zu benutzender Orbit-Simulator, der sich für Schüler, Studenten und Lehrer an Gymnasien, Hochschulen und Universitäten oder für jeden, der sich für Physik und Astronomie interessiert, eignet. Zum ersten Mal können Sie „Laborübungen“ in der Gravitationsphysik durchführen! Wenn Sie Probleme lösen, die die Umlaufbahnen von Satelliten, Planeten oder Sternen betreffen, wird es spannend sein, das Problem in Orbit Xplorer zu simulieren und seine numerische Ausgabe mit Ihren eigenen Lösungen zu vergleichen„. Orbit Xplorer benutzt FireMonkey und eine gute Anzahl von FireMonkey-Stilen.
Thu Nov 05 2020 22:05:02 GMT+0700 (Western Indonesia Time)
El desarrollador Tore Ottinsen dijo esto sobre su aplicación Orbit Xplorer: “Soy un profesor de física retirado de la escuela secundaria y un programador aficionado de Delphi. Esta es mi última aplicación de física, escrita en FMX para Windows. Espero hacer una versión para Mac pronto“. Es un buen ejemplo de lo accesible que es Delphi como IDE y Object Pascal como lenguaje de programación. Según el sitio web “Orbit Xplorer es un simulador de órbita fácil de usar adecuado para estudiantes y profesores de secundaria, colegios y universidades, o cualquier persona interesada en la física y la astronomía. Por primera vez puedes hacer” ejercicios de laboratorio “en ¡Física gravitacional! Si está resolviendo problemas que involucran órbitas de satélites, planetas o estrellas, será emocionante simular el problema en Orbit Xplorer y comparar su salida numérica con sus propias soluciones “. Orbit Xplorer hace uso de FireMonkey y una buena cantidad de estilos de FireMonkey.
Thu Nov 05 2020 22:04:36 GMT+0700 (Western Indonesia Time)
O desenvolvedor Tore Ottinsen disse sobre seu aplicativo Orbit Xplorer “Eu sou um professor de física aposentado e um programador Delphi amador. Este é meu aplicativo de física mais recente, escrito em FMX para Windows. Espero fazer uma versão para Mac em breve.” É um bom exemplo de quão acessível o Delphi é como IDE e Object Pascal como linguagem de programação. De acordo com o site “Orbit Xplorer é um simulador de órbita fácil de usar, adequado para estudantes e professores do ensino médio, universitários ou qualquer pessoa interessada em física e astronomia. Pela primeira vez você pode fazer” exercícios de laboratório ” física gravitacional! Se você está resolvendo problemas envolvendo órbitas de satélites, planetas ou estrelas, será emocionante simular o problema no Orbit Xplorer e comparar sua saída numérica com suas próprias soluções. ” O Orbit Xplorer usa FireMonkey e um bom número de estilos FireMonkey.
Thu Nov 05 2020 22:04:05 GMT+0700 (Western Indonesia Time)
Разработчик Торе Оттинсен сказал о своем приложении Orbit Xplorer следующее: «Я учитель физики в старшей школе на пенсии и увлекаюсь программированием на Delphi. Это мое последнее физическое приложение, написанное на FMX для Windows. Надеюсь скоро выпустить версию для Mac». Это хороший пример того, насколько доступен Delphi как IDE и Object Pascal как язык программирования. Согласно веб-сайту, «Orbit Xplorer — это простой в использовании симулятор орбиты, подходящий для старшеклассников, студентов и преподавателей колледжей и университетов, а также для всех, кто интересуется физикой и астрономией. Впервые вы можете выполнять« лабораторные упражнения »в гравитационная физика! Если вы решаете задачи, связанные с орбитами спутников, планет или звезд, будет интересно смоделировать проблему в Orbit Xplorer и сравнить ее числовые результаты с вашими собственными решениями ». Orbit Xplorer использует FireMonkey и большое количество стилей FireMonkey.
Thu Nov 05 2020 22:03:51 GMT+0700 (Western Indonesia Time)
Xinorbis ist ein sehr leistungsfähiger Festplatten-, Ordner- und Speicheranalysator, der über SourceForge verfügbar ist. Ein guter Teil davon ist Open Source und hauptsächlich in Delphi geschrieben. Andere mitgelieferte Dienstprogramme sind in C++ und C# geschrieben, was zeigt, wie einfach es ist, Delphi und Object Pascal in andere Sprachen zu integrieren. Auf der Website heißt es: „Es verwendet eine ausgeklügelte Mischung aus Graphen, Tabellen und Baumdarstellungen, um ein vollständiges und beispielloses Bild des Inhalts jeder Festplatte, SSD, jedes Ordners, Wechseldatenträgers oder Netzlaufwerks zu vermitteln. Wenn Ihr PC es sehen kann, kann Xinorbis es sogar scannen. Xinorbis macht es leicht, den Inhalt, die Struktur, die Dateiverteilung und die Dateizusammensetzung jedes angeschlossenen Speichergeräts zu erkennen. Es umfasst eine vollständig anpassbare Berichterstellung in ASCII, CSV, HTML und XML. Wie Sie sehen können, verwendet es einen Delphi-Stil, um ein dunkles Thema zu implementieren.
Thu Nov 05 2020 22:03:33 GMT+0700 (Western Indonesia Time)
Xinorbis es un analizador de almacenamiento, carpetas y discos duros muy potente disponible en SourceForge. Una buena parte es de código abierto y está escrito principalmente en Delphi. Otras utilidades incluidas con él están escritas en C ++ y C #, lo que muestra lo fácil que es integrar Delphi y Object Pascal con otros lenguajes. Según el sitio web “Utiliza una combinación sofisticada de gráficos, tablas y representaciones de árbol para brindar una imagen completa y sin precedentes del contenido de cualquier disco duro, SSD, carpeta, unidad extraíble o de red. De hecho, si su PC puede verlo, Xinorbis puede escanearlo. Xinorbis facilita ver el contenido, la estructura, la distribución de archivos y la composición de archivos de cualquier dispositivo de almacenamiento adjunto. Incluye generación de informes totalmente personalizables en ASCII, CSV, HTML y XML “. Como puede ver, usa un estilo Delphi para implementar un tema oscuro.
Thu Nov 05 2020 22:03:05 GMT+0700 (Western Indonesia Time)
Xinorbis é um disco rígido muito poderoso, analisador de pastas e armazenamento disponível no SourceForge. Uma boa parte dele é open source e principalmente escrito em Delphi. Outros utilitários incluídos nele são escritos em C ++ e C #, o que mostra como é fácil integrar Delphi e Object Pascal com outras linguagens. De acordo com o site “Ele usa uma mistura sofisticada de gráficos, tabelas e exibições de árvore para dar uma imagem completa e sem precedentes do conteúdo de qualquer disco rígido, SSD, pasta, unidade removível ou de rede. Na verdade, se o seu PC pode ver, Xinorbis pode digitalizá-lo. Xinorbis torna mais fácil ver o conteúdo, estrutura, distribuição de arquivo e composição de arquivo de qualquer dispositivo de armazenamento anexado. Inclui geração de relatórios totalmente personalizáveis em ASCII, CSV, HTML e XML. ” Como você pode ver, ele usa um estilo Delphi para implementar um tema escuro.
Thu Nov 05 2020 22:02:42 GMT+0700 (Western Indonesia Time)
Xinorbis — очень мощный анализатор жестких дисков, папок и хранилищ, доступный на SourceForge. Большая его часть имеет открытый исходный код и в основном написана на Delphi. Другие включенные в него утилиты написаны на C ++ и C #, что показывает, насколько легко интегрировать Delphi и Object Pascal с другими языками. Согласно веб-сайту, «он использует сложное сочетание графиков, таблиц и древовидных представлений, чтобы дать полную и беспрецедентную картину содержимого любого жесткого диска, SSD, папки, съемного или сетевого диска. Фактически, если ваш компьютер может видеть его, Xinorbis может сканировать его. Xinorbis позволяет легко видеть содержимое, структуру, распределение файлов и состав файлов любого подключенного устройства хранения. Он включает полностью настраиваемое создание отчетов в ASCII, CSV, HTML и XML ». Как видите, он использует стиль Delphi для реализации темной темы.
Tue Nov 03 2020 22:30:01 GMT+0700 (Western Indonesia Time)
DelphiFeeds.com wurde bereits 2005 von den Gurock-Brüdern eingeführt. Seitdem hat Gurocks TestRail- Produkt wirklich Fahrt aufgenommen und sie waren so beschäftigt, dass sie keine Zeit mehr hatten, DelphiFeeds zu warten. Es wurden weiterhin Feeds gesammelt und Überschriften ausgetauscht, es wurden jedoch keine aktualisierten Feedquellen mehr hinzugefügt. In der Zwischenzeit haben wir neue Websites wie BeginEnd.net und zuletzt DelphiMagazine.com mit aktualisierten Feed-Listen gesehen, aber DelphiFeeds war weiterhin die De-facto-Nachrichtenquelle für viele in der Community.
Während DelphiFeeds nie gestorben ist, wird es heute wiedergeboren. Läuft auf einem ganz neuen Server-Backend, allen alten Feeds und einigen aktualisierten neuen. Mit der Zeit werden neue Feedquellen hinzugefügt und aktualisiert und alte entfernt. Keiner der vorherigen Trendartikel oder Benutzerkonten wurde migriert, und die Registrierung neuer Benutzerkonten ist noch nicht aktiviert, aber all das und mehr werden in Kürze verfügbar sein.
Wenn Sie eine andere News-Site haben, die Sie bevorzugen, ist das in Ordnung, aber nicht. Dann würde ich Ihnen empfehlen, sich die neuen DelphiFeeds anzusehen und für weitere Updates und Upgrades auf dem Laufenden zu bleiben!
Tue Nov 03 2020 21:45:56 GMT+0700 (Western Indonesia Time)
DelphiFeeds.com foi lançado pelos irmãos Gurock por volta de 2005. Desde então, o produto TestRail de Gurock realmente decolou, e eles estavam tão ocupados que não tinham mais tempo para manter o DelphiFeeds. Ela continuou coletando feeds e compartilhando manchetes, mas não estava mais adicionando fontes de feed atualizadas. Nesse ínterim, vimos novos sites como BeginEnd.net e mais recentemente DelphiMagazine.com com listas de feeds atualizadas, mas DelphiFeeds continuou a ser a fonte de notícias de fato para muitos na comunidade.
Embora o DelphiFeeds nunca tenha morrido, hoje ele renasce. Executando em um back-end de servidor totalmente novo, todos os feeds antigos e alguns novos atualizados. Com o tempo, novas fontes de feed serão adicionadas e atualizadas, e as antigas serão removidas. Nenhum dos artigos de tendência anteriores ou contas de usuário foram migrados e o registro de novas contas de usuários ainda não está habilitado, mas tudo isso e muito mais virão em breve.
Se você tem outro site de notícias de sua preferência, tudo bem, mas não é, então eu recomendo que você verifique o novo DelphiFeeds e fique ligado para mais atualizações e upgrades!
Tue Nov 03 2020 21:45:17 GMT+0700 (Western Indonesia Time)
DelphiFeeds.com fue lanzado por los hermanos Gurock alrededor de 2005. Desde entonces, el producto TestRail de Gurock realmente despegó, y estaban tan ocupados que ya no tenían tiempo para mantener DelphiFeeds. Continuó recopilando feeds y compartiendo titulares, pero ya no estaba agregando fuentes de feeds actualizadas. Mientras tanto, hemos visto nuevos sitios como BeginEnd.net y, más recientemente, DelphiMagazine.com con listas de feeds actualizadas, pero DelphiFeeds continuó siendo la fuente de noticias de facto para muchos en la comunidad.
Si bien DelphiFeeds nunca murió, hoy renace. Se ejecuta en un servidor backend completamente nuevo, todos los feeds antiguos y algunos nuevos actualizados. Con el tiempo, se agregarán y actualizarán nuevas fuentes de alimentación, y se eliminarán las antiguas. Ninguno de los artículos de tendencias anteriores o cuentas de usuario se migró, y el registro de cuentas de nuevos usuarios aún no está habilitado, pero todo eso y más llegarán pronto.
Si tiene otro sitio de noticias que prefiere, está bien, pero no es así, entonces le recomendaría que consulte el nuevo DelphiFeeds y permanezca atento a más actualizaciones y mejoras.
Tue Nov 03 2020 00:11:21 GMT+0700 (Western Indonesia Time)
Dreamsofts Optimization Ltd. имеет отмеченный наградами оптимизатор грузовых контейнеров, доступный в магазинах iOS и Mac. Приложение также доступно для Windows и построено на Delphi FireMonkey. Доступны как профессиональная, так и корпоративная версия с разными наборами функций. Приложение описывается как «Первая загрузка контейнера и загрузка поддонов на мобильной платформе. Вы нашли самое простое приложение для оптимизации загрузки контейнеров / поддонов. Имитируйте загрузку вашего груза за считанные минуты, а не часы или дни! Максимизируйте свои перевозки с помощью коробок и контейнера / грузовика / поддон и сэкономить деньги и время «. Некоторые из наград, полученных приложением, — это «Победитель в области розничных продаж и цепочки поставок, Таиланд ICT Award 2014» и «Премия за заслуги в Азиатско-Тихоокеанском регионе в области ИКТ 2014». Это действительно потрясающе выглядящее приложение, которое использует все возможности FireMonkey, чтобы это произошло.
Tue Nov 03 2020 00:11:02 GMT+0700 (Western Indonesia Time)
A Dreamsofts Optimization Ltd. tem um premiado otimizador de carga em contêiner de remessa disponível nas lojas iOS e Mac. O aplicativo também está disponível no Windows e é integrado ao Delphi FireMonkey. As versões profissional e empresarial estão disponíveis com diferentes conjuntos de recursos. O aplicativo é descrito como “Carregamento de primeiro contêiner e carregamento de paletes na plataforma móvel. Você encontrou o aplicativo de otimização de carregamento de contêiner / palete mais fácil. Simule o carregamento de sua carga em minutos, não em horas ou dias! Maximize seu transporte com caixas e contêiner / caminhão / palete e economize tempo e dinheiro. ” Alguns dos prêmios que o aplicativo recebeu são “Winner Retails & Supply Chain Application Thailand ICT Award 2014” e “Merit award Asia Pacific ICT Award 2014”. É realmente um aplicativo de aparência incrível e utiliza todos os recursos do FireMonkey para fazer isso acontecer.
Tue Nov 03 2020 00:08:34 GMT+0700 (Western Indonesia Time)
Dreamsofts Optimization Ltd. tiene un optimizador de carga de contenedores de envío galardonado disponible en las tiendas iOS y Mac. La aplicación también está disponible en Windows y está integrada en Delphi FireMonkey. Tanto la versión profesional como la empresarial están disponibles con diferentes conjuntos de funciones. La aplicación se describe como “Primera carga de contenedores y carga de palés en una plataforma móvil. Ha encontrado la aplicación de optimización de carga de contenedores / palés más sencilla. ¡Simule la carga de su carga en minutos, no en horas o días! Maximice su envío con cajas y contenedor / camión / palet y ahorre tiempo y dinero “. Algunos de los premios que ha recibido la aplicación son “Ganador de ventas al por menor y aplicación de cadena de suministro Tailandia ICT Award 2014” y “Premio al mérito Asia Pacific ICT Award 2014”. Realmente es una aplicación de aspecto increíble y utiliza todas las funciones de FireMonkey para que esto suceda.
Tue Nov 03 2020 00:08:02 GMT+0700 (Western Indonesia Time)
Dreamsofts Optimization Ltd. verfügt über einen preisgekrönten Fracht-Optimierer für Schiffscontainer, der in den iOS- und Mac-Stores erhältlich ist. Die Anwendung ist auch für Windows verfügbar und ist in Delphi FireMonkey integriert. Sowohl eine Profi- als auch eine Enterprise-Version sind mit unterschiedlichen Funktionssätzen erhältlich. Die Anwendung wird als „Erste Container- und Palettenbeladung auf mobiler Plattform“ beschrieben. Sie haben die einfachste Anwendung zur Optimierung der Container-/Palettenbeladung gefunden. Simulieren Sie die Beladung Ihrer Fracht in Minuten, nicht in Stunden oder Tagen ! Maximieren Sie Ihren Versand mit Kisten und Container/LKW/Paletten und sparen Sie Geld und Zeit. Einige der Auszeichnungen, die die Anwendung erhalten hat, sind „Winner Retails & Supply Chain Application Thailand ICT Award 2014“ und „Merit award Asia Pacific ICT Award 2014“. Es ist wirklich eine erstaunlich aussehende Anwendung und nutzt alle Funktionen von FireMonkey, um dies zu ermöglichen.
Tue Nov 03 2020 00:07:44 GMT+0700 (Western Indonesia Time)
MultitrackStudio от Bremmers Audio Design — это программа для многодорожечной записи музыки, которая поддерживает запись, редактирование и микширование аудио- и MIDI-треков. С распространением Mac во всем мире разработчики MultitrackStudio почувствовали необходимость сделать свое приложение доступным на macOS. Ранее они использовали Delphi с VCL (Visual Component Library), объектно-ориентированной средой на основе визуальных компонентов для разработки приложений Microsoft Windows. Когда Embarcadero Technologies выпустила Delphi с FireMonkey, разработчики MultitrackStudio переработали свои настраиваемые элементы управления для работы как с VCL, так и с FireMonkey. Delphi RTL (функции и процедуры библиотеки времени выполнения) предоставил им кросс-платформенные версии наиболее распространенных функций, и они могли программировать на любой платформе C или Какао. После написания некоторого кода для Mac, включая Core Audio и Audio Units, у них была запущенная версия на macOS.
Tue Nov 03 2020 00:07:26 GMT+0700 (Western Indonesia Time)
MultitrackStudio da Bremmers Audio Design é um software de gravação de música multitrack que suporta gravação, edição e mixagem de áudio e trilhas MIDI. Com o crescimento do Mac em todo o mundo, os desenvolvedores do MultitrackStudio sentiram a urgência de disponibilizar seus aplicativos no macOS. Eles já haviam usado Delphi com VCL (Visual Component Library), um framework orientado a objetos baseado em componentes visuais para o desenvolvimento de aplicações Microsoft Windows. Quando a Embarcadero Technologies lançou o Delphi com FireMonkey, os desenvolvedores do MultitrackStudio retrabalharam seus controles personalizados para trabalhar com VCL e FireMonkey. O Delphi RTL (funções e procedimentos de biblioteca de tempo de execução) fornecia versões multiplataforma das funções mais comuns e eles podiam programar em qualquer framework C ou Cocoa. Depois de escrever algum código específico para Mac, incluindo Core Audio e Audio Units, eles tiveram uma versão em execução no macOS.
Tue Nov 03 2020 00:06:29 GMT+0700 (Western Indonesia Time)
MultitrackStudio de Bremmers Audio Design es un software de grabación de música multipista que admite la grabación, edición y mezcla de pistas de audio y MIDI. Con el crecimiento de Mac en todo el mundo, los desarrolladores de MultitrackStudio sintieron la urgencia de hacer que su aplicación estuviera disponible en macOS. Anteriormente habían usado Delphi con VCL (Visual Component Library), un marco orientado a objetos basado en componentes visuales para desarrollar aplicaciones de Microsoft Windows. Cuando Embarcadero Technologies lanzó Delphi con FireMonkey, los desarrolladores de MultitrackStudio modificaron sus controles personalizados para trabajar con VCL y FireMonkey. Delphi RTL (funciones y procedimientos de biblioteca en tiempo de ejecución) les proporcionó versiones multiplataforma de las funciones más comunes y podían programar contra cualquier marco C o Cocoa. Después de escribir un código específico de Mac, incluidas Core Audio y Audio Units, tenían una versión en ejecución en macOS.
Tue Nov 03 2020 00:06:07 GMT+0700 (Western Indonesia Time)
MultitrackStudio von Bremmers Audio Design ist eine Mehrspur-Musikaufnahme-Software, die das Aufnehmen, Bearbeiten und Mischen von Audio- und MIDI-Spuren unterstützt. Mit dem weltweiten Wachstum des Mac spürten die Entwickler von MultitrackStudio die Dringlichkeit, ihre Anwendung auf dem MacOS verfügbar zu machen. Zuvor hatten sie Delphi mit VCL (Visual Component Library) verwendet, ein auf visuellen Komponenten basierendes objektorientiertes Framework für die Entwicklung von Microsoft Windows-Anwendungen. Als Embarcadero Technologies Delphi mit FireMonkey veröffentlichte, überarbeiteten die MultitrackStudio-Entwickler ihre benutzerdefinierten Steuerelemente, um sowohl mit VCL als auch mit FireMonkey arbeiten zu können. Mit der Delphi RTL (Runtime Library Functions and Procedures) erhielten sie plattformübergreifende Versionen der gängigsten Funktionen und konnten gegen jedes C- oder Cocoa-Framework programmieren. Nachdem sie etwas Mac-spezifischen Code einschließlich Core Audio und Audio Units geschrieben hatten, hatten sie eine laufende Version unter MacOS.
Fri Oct 30 2020 23:44:44 GMT+0700 (Western Indonesia Time)
WinSCP ist ein beliebter, preisgekrönter nativer SFTP-Client, FTP-Client und Dateimanager für Microsoft Windows. Er wurde über 143 Millionen Mal heruntergeladen und ist in vielen Sprachen verfügbar. WinSCP wird mit einer Reihe von Programmiersprachen erstellt, aber C++Builder ist das Hauptwerkzeug, das die grafische Benutzeroberfläche unterstützt. Es ist ein großartiges Beispiel für die Nutzung der schnellen UI-Entwicklungsfähigkeiten von C++Builder in Kombination mit anderen Programmiersprachen. Es verfügt über einen integrierten Texteditor und unterstützt Skripting und Automatisierung. Es handelt sich um eine native Windows-Anwendung, die für den Download nur 10,9 Megabyte wiegt und nur 9,2 Megabyte Systemspeicher verwendet, der auf einer Standard-SFTP-Site angemeldet ist. Sie bietet sowohl eine Explorer-ähnliche als auch eine Commander-ähnliche Schnittstelle sowie die Integration von PuTTY, Pageant und nativem Windows-Drag & Drop.
Fri Oct 30 2020 22:55:49 GMT+0700 (Western Indonesia Time)
In Zusammenarbeit mit Unternehmen wie Raize Software, DevExpress und Microsoft veranstaltete Embarcadero Mitte September 2020 den Desktop First UX Summit. Diese dreitägige Veranstaltung brachte mehr als ein Dutzend Embarcadero-MVPs und technische Partner zusammen, um sich mit dem Thema Desktop User Experience und UI / UX-Design zu befassen. diskutieren in einer Zeit des Mobile-First-Fiebers. Beginnend mit einer Keynote-Präsentation von Ray Konopka (Präsident, Raize Software) zum aktuellen Stand von Desktop-UX und falsch angewendetem Design für mobile Benutzeroberflächen behandelte der Gipfel eine Vielzahl von Themen, von reibungslosem und konsistentem UX-Design bis hin zur Bedeutung Klicken Sie mit der rechten Maustaste auf Kontextmenüs. Eine vollständige Liste der Referenten und ihrer Präsentationen finden Sie unter Summit.desktopfirst.com.
Um die Reichweite dieser Experten zu erhöhen und fundierte Designpraktiken zu fördern, schreibe ich eine Reihe von Beiträgen, um die Highlights jeder Präsentation und jedes Panels festzuhalten und einen Link zur vollständigen Präsentation bereitzustellen.
Fri Oct 30 2020 22:34:13 GMT+0700 (Western Indonesia Time)
Der absolut schnellste Weg, um mit der Linux-Bereitstellung von Delphi aus zu beginnen, ist die Verwendung des Windows-Subsystems für Linux (WSL). Ab Windows 10 Version 2004 (Build 19041) enthält WSL2 einen vollständigen Linux-Kernel, sodass das Debuggen und alles wie erwartet funktioniert.
Installieren Sie WSL2 (Sie können Ihre Build-Nummer über das Systeminformations-Applet überprüfen, Build 19041 ist jedoch bereits seit einiger Zeit verfügbar.)
Schalttafel
Programme
Schalte Windows Funktionen ein oder aus
Windows-Subsystem für Linux
Starten Sie neu
Installieren Sie Ubuntu über den Microsoft Store – Ubuntu ohne Versionsnummer ist die aktuelle LTS-Version und wird in Zukunft aktualisiert. Es gibt andere Distributionen ( Kali , Pegwin , Alpine WSL usw.), aber alle sind etwas anders.
Starten Sie Ubuntu – Über das Startmenü oder über ein PowerShell / Terminal / CLI-Fenster mit den Befehlen WSLoder Ubuntu . Wenn Sie mehr als ein Linux installiert haben, startet WSL das Standard-Linux. Beachten Sie beim ersten Start, dass dies einige Minuten dauert, und fordern Sie dann zur Eingabe neuer Linux-Anmeldeinformationen auf.
Führen Sie SetupUbuntu4Delphi21.sh aus – Ich habe ein Skript auf gist erstellt, das alle Einstellungen für Ubuntu vornimmt, um es für das Targeting von Delphi vorzubereiten. Sie können wgetes herunterladen oder die Befehle manuell eingeben. Es erstellt eine Skriptdatei mit dem Namen pa21.sh in Ihrem Home-Ordner, um PAServer schnell zu starten. Sie können es ändern, um die Standardkonfigurationseinstellungen zu übergeben.
#!/bin/bash
echo Updating the local package directory
sudo apt update
echo Upgrade any outdated pacakges
sudo apt full-upgrade -y
echo Intall new packages necessary for Delphi
sudo apt install joe wget p7zip-full curl openssh-server build-essential zlib1g-dev libcurl4-gnutls-dev libncurses5 xorg libgl1-mesa-dev libosmesa-dev libgtk-3-bin -y
echo Clean-up unused packages
sudo apt autoremove -y
cd ~
echo Downloading LinuxPAServer for Sydney 10.4 (21.0) Update 1
wget https://altd.embarcadero.com/releases/studio/21.0/1/PAServer/LinuxPAServer21.0.tar.gz
echo Setting up directories to extract PA Server into
mkdir PAServer
mkdir PAServer/21.0
tar xvf LinuxPAServer21.0.tar.gz -C PAServer/21.0 --strip-components=1
rm LinuxPAServer21.0.tar.gz
echo #!/bin/bash >pa21.sh
echo ~/PAServer/21.0/paserver >>pa21.sh
chmod +x pa21.sh
echo -----------------------------------
echo To launch PAServer type ~/pa21.sh
echo -----------------------------------
~/pa21.sh
Führen Sie den broadwayd Server – Sie sollten bereits paserverläuft (das Skript darüber ins Leben gerufen), so dass Sie wahrscheinlich ein neues Ubuntu Terminal – Fenster , wo Sie wollen , starten können broadwayd. Ich verwende gerne das neue Windows-Terminal, da es das Öffnen mehrerer Registerkarten erleichtert und sich gut in WSL integrieren lässt.
Importieren Sie das Linux-SDK in Delphi IDE – Extras> Optionen> Bereitstellung> SDK-Manager – Die IP-Adresse für die PAServer-Instanz lautet localhost / 127.0.0.1. Denken Sie also daran, dass Sie Ports zwischen der WSL-Instanz und Ihrem Windows 10-Hostbetriebssystem gemeinsam nutzen.
Jetzt müssen Sie nur noch die meisten FireMonky-Projekte ausführen und über localhost:8080Ihren Browser eine Verbindung herstellen.
Beachten Sie, dass für jeden Client eine Instanz der App auf dem Server ausgeführt wird und jede über eine eigene Portnummer verfügt. Es gibt Möglichkeiten, dies mit ein wenig Aufwand auf dem Server zu verwalten, aber das ist ein Blog-Beitrag für einen anderen Tag.
Fri Oct 30 2020 21:44:59 GMT+0700 (Western Indonesia Time)
В сотрудничестве с такими компаниями, как Raize Software, DevExpress и Microsoft, Embarcadero провела в середине сентября 2020 года саммит Desktop First UX Summit. Это трехдневное мероприятие собрало более десятка MVP Embarcadero и технических партнеров, чтобы обсудить тему взаимодействия с настольными компьютерами и дизайна UI / UX в эпоху лихорадки Mobile-First. Начавшись с основного доклада Рэя Конопки (президента Raize Software) о текущем состоянии пользовательского интерфейса для настольных ПК и неверно применяемого дизайна пользовательского интерфейса для мобильных устройств, на саммите был рассмотрен широкий спектр тем, от плавного и последовательного дизайна пользовательского интерфейса до важности контекстных меню, вызываемых правой кнопкой мыши. . Полный список докладчиков и их презентации можно найти на сайте summit.desktopfirst.com.
Чтобы расширить охват этих экспертов и продвигать методы звукового дизайна, я пишу серию сообщений, чтобы зафиксировать основные моменты каждой презентации и панели и предоставить ссылку на полную презентацию.
Fri Oct 30 2020 21:44:41 GMT+0700 (Western Indonesia Time)
Em parceria com empresas como Raize Software, DevExpress e Microsoft, a Embarcadero sediou o Desktop First UX Summit em meados de setembro de 2020. Este evento de três dias reuniu mais de uma dúzia de MVPs da Embarcadero e parceiros de tecnologia para discutir o assunto Experiência do usuário de desktop e design de UI / UX em uma época de febre do Mobile First. Começando com uma apresentação de Ray Konopka (presidente, Raize Software) sobre o estado atual da experiência do usuário em desktops e design de interface do usuário móvel mal aplicado, o encontro cobriu uma ampla variedade de tópicos, desde design de experiência do usuário fluente e consistente até a importância dos menus de contexto do botão direito . Uma lista completa de palestrantes e suas apresentações pode ser encontrada em summit.desktopfirst.com.
A fim de ampliar o alcance desses especialistas e promover práticas de design de som, estou escrevendo uma série de posts para capturar os destaques de cada apresentação e painel e fornecer um link para a apresentação completa.
Fri Oct 30 2020 21:44:03 GMT+0700 (Western Indonesia Time)
En asociación con empresas como Raize Software, DevExpress y Microsoft, Embarcadero organizó la Desktop First UX Summit a mediados de septiembre de 2020. Este evento de tres días reunió a más de una docena de MVP de Embarcadero y socios tecnológicos para discutir el tema de la experiencia del usuario de escritorio y el diseño de UI / UX en una era de fiebre de Mobile-First. Comenzando con una presentación principal de Ray Konopka (presidente, Raize Software) sobre el estado actual de la experiencia de usuario de escritorio y el diseño de la interfaz de usuario móvil mal aplicado, la cumbre cubrió una amplia variedad de temas, desde el diseño fluido y consistente de la experiencia de usuario hasta la importancia de los menús contextuales del botón derecho del ratón. . Puede encontrar una lista completa de oradores y sus presentaciones en summit.desktopfirst.com.
Para ampliar el alcance de estos expertos y promover prácticas de diseño sólidas, estoy escribiendo una serie de publicaciones para capturar los aspectos más destacados de cada presentación y panel y proporcionar un enlace a la presentación completa.
Fri Oct 30 2020 21:43:41 GMT+0700 (Western Indonesia Time)
Самый быстрый способ начать развертывание Linux из Delphi — использовать подсистему Windows для Linux (WSL). Начиная с Windows 10 версии 2004 (сборка 19041) WSL2 включает полное ядро Linux, поэтому отладка и все работает, как ожидалось.
Установите WSL2 (номер сборки можно проверить с помощью апплета «Информация о системе», но сборка 19041 уже доступна уже некоторое время.)
Панель управления
Программ
Включение и отключение функций Windows
Подсистема Windows для Linux
перезагрузка
Установите Ubuntu через Microsoft Store — Ubuntu без версии # является текущей версией LTS и будет обновляться в будущем. Есть и другие дистрибутивы (Kali, Pegwin, Alpine WSL и т. Д.), Но все они немного отличаются.
Запустите Ubuntu — через меню «Пуск» или из окна PowerShell / Terminal / CLI с помощью команд WSL или Ubuntu. Если у вас установлено более одного Linux, WSL запускает тот, который используется по умолчанию. При первом запуске имейте в виду, что это займет несколько минут, а затем вам будет предложено ввести новые учетные данные Linux.
Запустите SetupUbuntu4Delphi21.sh — я создал сценарий в gist, который выполняет все настройки для Ubuntu, чтобы он был готов к таргетингу из Delphi. Вы можете использовать wget для загрузки или вводить команды вручную. Он создает файл сценария с именем pa21.sh в вашей домашней папке для быстрого запуска PAServer. Вы можете изменить его, чтобы передать настройки конфигурации по умолчанию.
#!/bin/bash
echo Updating the local package directory
sudo apt update
echo Upgrade any outdated pacakges
sudo apt full-upgrade -y
echo Intall new packages necessary for Delphi
sudo apt install joe wget p7zip-full curl openssh-server build-essential zlib1g-dev libcurl4-gnutls-dev libncurses5 xorg libgl1-mesa-dev libosmesa-dev libgtk-3-bin -y
echo Clean-up unused packages
sudo apt autoremove -y
cd ~
echo Downloading LinuxPAServer for Sydney 10.4 (21.0) Update 1
wget https://altd.embarcadero.com/releases/studio/21.0/1/PAServer/LinuxPAServer21.0.tar.gz
echo Setting up directories to extract PA Server into
mkdir PAServer
mkdir PAServer/21.0
tar xvf LinuxPAServer21.0.tar.gz -C PAServer/21.0 --strip-components=1
rm LinuxPAServer21.0.tar.gz
echo #!/bin/bash >pa21.sh
echo ~/PAServer/21.0/paserver >>pa21.sh
chmod +x pa21.sh
echo -----------------------------------
echo To launch PAServer type ~/pa21.sh
echo -----------------------------------
~/pa21.sh
Запустите сервер Broadwayd — у вас уже должен быть запущен paserver (его запустил сценарий, приведенный выше), поэтому вам, вероятно, понадобится новое окно терминала Ubuntu, в котором вы можете запустить Broadwayd. Мне нравится использовать новый терминал Windows, поскольку он позволяет легко открывать несколько вкладок, а WSL прекрасно интегрируется с ним.
Импортируйте Linux SDK в Delphi IDE — Инструменты> Параметры> Развертывание> Диспетчер SDK — IP-адрес для экземпляра PAServer — localhost / 127.0.0.1, поэтому имейте в виду, что вы разделяете порты между экземпляром WSL и вашей ОС Windows 10.
Теперь остается лишь запустить любой проект FireMonky и подключиться к localhost: 8080 из вашего браузера.
Следует иметь в виду, что для каждого клиента на сервере работает один экземпляр приложения, и у каждого из них есть собственный номер порта. Есть способы управлять этим на сервере с небольшими усилиями, но это сообщение в блоге на другой день.
Fri Oct 30 2020 21:43:20 GMT+0700 (Western Indonesia Time)
A maneira absolutamente mais rápida de iniciar a implantação do Linux a partir do Delphi é usar o Windows Subsystem for Linux (WSL). A partir do Windows 10 Versão 2004 (Build 19041), o WSL2 inclui um kernel Linux completo, portanto, a depuração e tudo funciona conforme o esperado.
Instale o WSL2 (você pode verificar o número da sua compilação por meio do miniaplicativo de informações do sistema, mas a compilação 19041 já está disponível há algum tempo.)
Painel de controle
Programas
Liga ou desliga características das janelas
Subsistema Windows para Linux
Reiniciar
Instale o Ubuntu através da Microsoft Store – Ubuntu sem versão # é a versão LTS atual e será atualizado no futuro. Existem outras distribuições (Kali, Pegwin, Alpine WSL, etc.), mas todas são um pouco diferentes.
Inicie o Ubuntu – por meio do menu Iniciar ou de uma janela PowerShell / Terminal / CLI com os comandos WSL ou Ubuntu. Se você tiver mais de um Linux instalado, o WSL iniciará o padrão. Ao iniciá-lo pela primeira vez, saiba que levará alguns minutos e, em seguida, solicitará novas credenciais do Linux.
Execute SetupUbuntu4Delphi21.sh – Eu fiz um script no gist que faz toda a configuração do Ubuntu para deixá-lo pronto para ser direcionado a partir do Delphi. Você pode usar o wget para baixá-lo ou digitar os comandos manualmente. Ele cria um arquivo de script chamado pa21.sh em sua pasta pessoal para iniciar o PAServer rapidamente. Você pode modificá-lo para passar as configurações padrão.
#!/bin/bash
echo Updating the local package directory
sudo apt update
echo Upgrade any outdated pacakges
sudo apt full-upgrade -y
echo Intall new packages necessary for Delphi
sudo apt install joe wget p7zip-full curl openssh-server build-essential zlib1g-dev libcurl4-gnutls-dev libncurses5 xorg libgl1-mesa-dev libosmesa-dev libgtk-3-bin -y
echo Clean-up unused packages
sudo apt autoremove -y
cd ~
echo Downloading LinuxPAServer for Sydney 10.4 (21.0) Update 1
wget https://altd.embarcadero.com/releases/studio/21.0/1/PAServer/LinuxPAServer21.0.tar.gz
echo Setting up directories to extract PA Server into
mkdir PAServer
mkdir PAServer/21.0
tar xvf LinuxPAServer21.0.tar.gz -C PAServer/21.0 --strip-components=1
rm LinuxPAServer21.0.tar.gz
echo #!/bin/bash >pa21.sh
echo ~/PAServer/21.0/paserver >>pa21.sh
chmod +x pa21.sh
echo -----------------------------------
echo To launch PAServer type ~/pa21.sh
echo -----------------------------------
~/pa21.sh
Execute o servidor broadwayd – você já deve ter o paserver em execução (o script acima o lançou), então provavelmente você desejará uma nova janela de terminal do Ubuntu onde possa iniciar broadwayd. Gosto de usar o novo Terminal do Windows, pois facilita a abertura de várias guias e o WSL se integra perfeitamente a ele.
Importe o Linux SDK no Delphi IDE – Ferramentas> Opções> Implementação> SDK Manager – O endereço IP da instância PAServer é localhost / 127.0.0.1, portanto, lembre-se de que você está compartilhando portas entre a instância WSL e seu host Windows 10 OS.
Agora é apenas uma questão de executar quase qualquer projeto FireMonky e conectar-se ao localhost: 8080 do seu navegador.
Uma coisa a se ter em mente é que há uma instância do aplicativo em execução no servidor para cada cliente e cada um tem seu próprio número de porta. Existem maneiras de gerenciar isso no servidor com um pouco de esforço, mas isso é uma postagem de blog para outro dia.
Fri Oct 30 2020 21:42:36 GMT+0700 (Western Indonesia Time)
La forma más rápida de comenzar con la implementación de Linux desde Delphi es usar el Subsistema de Windows para Linux (WSL). A partir de Windows 10, versión 2004 (compilación 19041), WSL2 incluye un kernel completo de Linux, por lo que la depuración y todo funciona como se esperaba.
Instale WSL2 (puede verificar su número de compilación a través del subprograma de información del sistema, pero la compilación 19041 ha estado disponible durante un tiempo).
Panel de control
Programas
Activar o desactivar las características de windows
Subsistema de Windows para Linux
Reiniciar
Instale Ubuntu a través de Microsoft Store: Ubuntu sin el número de versión es la versión LTS actual y se actualizará en el futuro. Hay otras distribuciones (Kali, Pegwin, Alpine WSL, etc.), pero todas son un poco diferentes.
Inicie Ubuntu: a través del menú Inicio o desde una ventana de PowerShell / Terminal / CLI con los comandos de WSL o Ubuntu. Si tiene más de un Linux instalado, WSL lanza el predeterminado. La primera vez que lo inicie, tenga en cuenta que tomará unos minutos y luego le pedirá nuevas credenciales de Linux.
Ejecute SetupUbuntu4Delphi21.sh: hice un script en gist que hace toda la configuración de Ubuntu para que esté listo para apuntar desde Delphi. Puede usar wget para descargarlo o puede escribir los comandos manualmente. Crea un archivo de script llamado pa21.sh en su carpeta de inicio para iniciar PAServer rápidamente. Puede modificarlo para pasar los ajustes de configuración predeterminados.
#!/bin/bash
echo Updating the local package directory
sudo apt update
echo Upgrade any outdated pacakges
sudo apt full-upgrade -y
echo Intall new packages necessary for Delphi
sudo apt install joe wget p7zip-full curl openssh-server build-essential zlib1g-dev libcurl4-gnutls-dev libncurses5 xorg libgl1-mesa-dev libosmesa-dev libgtk-3-bin -y
echo Clean-up unused packages
sudo apt autoremove -y
cd ~
echo Downloading LinuxPAServer for Sydney 10.4 (21.0) Update 1
wget https://altd.embarcadero.com/releases/studio/21.0/1/PAServer/LinuxPAServer21.0.tar.gz
echo Setting up directories to extract PA Server into
mkdir PAServer
mkdir PAServer/21.0
tar xvf LinuxPAServer21.0.tar.gz -C PAServer/21.0 --strip-components=1
rm LinuxPAServer21.0.tar.gz
echo #!/bin/bash >pa21.sh
echo ~/PAServer/21.0/paserver >>pa21.sh
chmod +x pa21.sh
echo -----------------------------------
echo To launch PAServer type ~/pa21.sh
echo -----------------------------------
~/pa21.sh
Ejecute el servidor de broadwayd: ya debería tener paserver en ejecución (el script anterior lo lanzó), por lo que probablemente querrá una nueva ventana de terminal de Ubuntu donde pueda iniciar broadwayd. Me gusta usar la nueva Terminal de Windows, ya que facilita la apertura de varias pestañas y WSL se integra muy bien con ella.
Importar Linux SDK en Delphi IDE – Herramientas> Opciones> Implementación> SDK Manager – La dirección IP para la instancia PAServer es localhost / 127.0.0.1;, así que tenga en cuenta que está compartiendo puertos entre la instancia WSL y su sistema operativo Windows 10 host.
Ahora es solo cuestión de ejecutar la mayoría de los proyectos de FireMonky y conectarse a localhost: 8080 desde su navegador.
Una cosa a tener en cuenta es que hay una instancia de la aplicación ejecutándose en el servidor para cada cliente, y cada uno tiene su propio número de puerto. Hay formas de administrar esto en el servidor con un poco de esfuerzo, pero esa es una publicación de blog para otro día.
Fri Oct 30 2020 00:05:45 GMT+0700 (Western Indonesia Time)
WinSCP — это популярный отмеченный наградами собственный клиент SFTP, FTP-клиент и файловый менеджер для Microsoft Windows. Его скачали более 143 миллионов раз, и он доступен на многих языках. WinSCP построен на нескольких языках программирования, но C ++ Builder является основным инструментом, обеспечивающим его графический пользовательский интерфейс. Это отличный пример использования возможностей быстрой разработки пользовательского интерфейса C ++ Builder в сочетании с другими языками программирования. Он имеет встроенный текстовый редактор и поддерживает создание сценариев и автоматизацию. Это родное приложение для Windows, вес которого для загрузки составляет всего 10,9 мегабайт, и он использует только 9,2 мегабайта системной памяти, зарегистрированной на стандартном сайте SFTP. Он имеет как интерфейс, подобный проводнику, так и интерфейс, подобный командованию, в дополнение к интеграции с PuTTY, Pageant и собственным перетаскиванием Windows.
Fri Oct 30 2020 00:05:02 GMT+0700 (Western Indonesia Time)
WinSCP é um cliente SFTP nativo, cliente FTP e gerenciador de arquivos popular e premiado para Microsoft Windows. Ele foi baixado mais de 143 milhões de vezes e está disponível em vários idiomas. O WinSCP é construído com uma série de linguagens de programação, mas C ++ Builder é a principal ferramenta para sua interface gráfica de usuário. É um ótimo exemplo de como aproveitar os recursos de desenvolvimento de IU rápido do C ++ Builder em combinação com outras linguagens de programação. Possui um editor de texto integrado e suporta scripts e automação. É um aplicativo nativo do Windows pesando apenas 10,9 megabytes para download e usa apenas 9,2 megabytes de memória do sistema registrado em um site SFTP padrão. Ele apresenta uma interface semelhante a Explorer e uma interface semelhante a Commander, além de integração com PuTTY, Pageant e arrastar e soltar nativo do Windows.
Fri Oct 30 2020 00:04:21 GMT+0700 (Western Indonesia Time)
WinSCP es un popular cliente SFTP nativo, cliente FTP y administrador de archivos para Microsoft Windows. Se ha descargado más de 143 millones de veces y está disponible en muchos idiomas. WinSCP está construido con varios lenguajes de programación, pero C ++ Builder es la herramienta principal que impulsa su interfaz gráfica de usuario. Es un gran ejemplo de cómo aprovechar las capacidades de desarrollo rápido de UI de C ++ Builder en combinación con otros lenguajes de programación. Tiene un editor de texto integrado y admite scripts y automatización. Es una aplicación nativa de Windows que pesa solo 10,9 megabytes para la descarga y utiliza solo 9,2 megabytes de memoria del sistema registrada en un sitio SFTP estándar. Cuenta con una interfaz similar a Explorer y una interfaz similar a Commander, además de integración con PuTTY, Pageant y arrastrar y soltar nativo de Windows.
Thu Oct 29 2020 23:44:22 GMT+0700 (Western Indonesia Time)
Разработчик Ансгар Беккер создал HeidiSQL как легкий инструмент управления базами данных с открытым исходным кодом, который поддерживает MariaDB, MySQL, MS SQL, PostgreSQL и SQLite. Он очень эффективно использует собственные стили VCL Delphi, чтобы обеспечить красивый интерфейс, который разработчик может настроить по своему усмотрению. Некоторые из его мощных функций включают подключение через туннель SSH, создание и редактирование таблиц, представлений, хранимых процедур, триггеров и многое другое. Кроме того, он генерирует хороший экспорт SQL, экспортирует напрямую с одного сервера на другой, управляет правами пользователей, импортирует текстовые файлы и экспортирует строки таблиц в CSV, HTML, XML, SQL, LaTeX, Wiki Markup и PHP Array. Плюс еще много функций. Впечатляющее программное обеспечение, встроенное в Delphi, весит всего 11,9 мегабайт!
Thu Oct 29 2020 23:44:07 GMT+0700 (Western Indonesia Time)
O desenvolvedor Ansgar Becker criou o HeidiSQL como uma ferramenta leve de gerenciamento de banco de dados de código aberto que suporta MariaDB, MySQL, MS SQL, PostgreSQL e SQLite. Ele faz uso dos estilos VCL nativos do Delphi de forma muito eficaz para fornecer uma interface atraente que o desenvolvedor pode personalizar de acordo com sua preferência. Alguns de seus recursos poderosos incluem conexão via túnel SSH, criação e edição de tabelas, visualizações, procedimentos armazenados, gatilhos e muito mais. Além disso, gera excelentes exportações de SQL, exporta diretamente de um servidor para outro, gerencia privilégios de usuário, importa arquivos de texto e exporta linhas de tabela para CSV, HTML, XML, SQL, LaTeX, Wiki Markup e PHP Array. Além de muitos outros recursos. Um software impressionante construído em Delphi com certeza e pesando apenas 11,9 megabytes!
Thu Oct 29 2020 23:43:32 GMT+0700 (Western Indonesia Time)
El desarrollador Ansgar Becker creó HeidiSQL como una herramienta ligera de gestión de bases de datos de código abierto que admite MariaDB, MySQL, MS SQL, PostgreSQL y SQLite. Hace uso de los estilos VCL nativos de Delphi de manera muy efectiva para proporcionar una interfaz atractiva que el desarrollador puede personalizar según sus preferencias. Algunas de sus potentes funciones incluyen la conexión a través del túnel SSH, la creación y edición de tablas, vistas, procedimientos almacenados, desencadenadores y más. Además, genera buenas exportaciones de SQL, exporta directamente de un servidor a otro, administra privilegios de usuario, importa archivos de texto y exporta filas de tablas a CSV, HTML, XML, SQL, LaTeX, Wiki Markup y PHP Array. Además de muchas más funciones. ¡Un software impresionante construido en Delphi para estar seguro y con un peso de solo 11,9 megabytes!
Thu Oct 29 2020 23:12:35 GMT+0700 (Western Indonesia Time)
Broken Games — небольшая амбициозная независимая компания по разработке игр, базирующаяся в Берлине, Германия. Их флагманская игра Rise of Legions — это многопользовательская ролевая игра, доступная для платформы Windows. Соучредители Тобиас и Мартин сосредотачиваются на объединении людей посредством игр с играми, которые легко доступны для новых игроков, но обеспечивают достаточные проблемы и глубину для жесткой аудитории. Когда основатели Мартин Ланге и Тобиас Тенбуш основали свою независимую игровую компанию, они искали среду разработки и язык программирования с высокой производительностью, быстрым временем компиляции, а также превосходной читаемостью кода и поддержкой. Они нашли свой ответ с помощью Delphi®.
Thu Oct 29 2020 23:12:18 GMT+0700 (Western Indonesia Time)
A Broken Games é uma pequena e ambiciosa empresa independente de desenvolvimento de jogos com sede em Berlim, Alemanha. Seu principal jogo, Rise of Legions, é um RPG multiplayer disponível para a plataforma Windows. Os co-fundadores Tobias e Martin se concentram em unir as pessoas por meio de jogos que são facilmente acessíveis a novos jogadores, mas oferecem desafios e profundidade suficientes para o público hardcore. Quando os fundadores Martin Lange e Tobias Tenbusch começaram sua empresa de jogos independente, eles buscaram um ambiente de desenvolvimento e linguagem de programação com alto desempenho, tempos de compilação rápidos e capacidade de leitura e manutenção de código superior. Eles encontraram sua resposta com Delphi®.
Thu Oct 29 2020 23:11:45 GMT+0700 (Western Indonesia Time)
Broken Games es una pequeña y ambiciosa empresa de desarrollo de juegos independiente con sede en Berlín, Alemania. Su juego insignia, Rise of Legions, es un juego de rol multijugador disponible para la plataforma Windows. Los cofundadores Tobias y Martin se enfocan en unir a las personas a través del juego con juegos que son fácilmente accesibles para los nuevos jugadores pero que brindan suficientes desafíos y profundidad para un público incondicional. Cuando los fundadores Martin Lange y Tobias Tenbusch iniciaron su compañía de juegos independiente, buscaron un entorno de desarrollo y un lenguaje de programación con alto rendimiento, tiempos de compilación rápidos y una legibilidad y mantenimiento de código superior. Encontraron su respuesta con Delphi®.
Thu Oct 29 2020 23:11:11 GMT+0700 (Western Indonesia Time)
Broken Games ist eine kleine, aufstrebende, unabhängige Spielentwicklungsfirma mit Sitz in Berlin. Ihr Flaggschiff, Rise of Legions, ist ein Multiplayer-RPG, das für die Windows-Plattform erhältlich ist. Die Mitbegründer Tobias und Martin konzentrieren sich darauf, Menschen durch das Spielen zusammenzubringen, mit Spielen, die für neue Spieler leicht zugänglich sind, aber auch genügend Herausforderungen und Tiefe für ein Hardcore-Publikum bieten. Als die Gründer Martin Lange und Tobias Tenbusch ihre unabhängige Spielefirma starteten, suchten sie nach einer Entwicklungsumgebung und Programmiersprache mit hoher Leistung, schnellen Kompilierzeiten und hervorragender Lesbarkeit und Wartung des Codes. Mit Delphi® haben sie ihre Antwort gefunden.
Windows 10 wird jetzt von 3 von 4 Windows-Desktop-Computern verwendet! Dieser Marktanteil stieg 2020 um rund 10%, nachdem Windows 7 ursprünglich Ende 2017 bestanden hatte.
Windows 7 ist auf rund 18% gesunken und fällt. Zum Teil, da Unternehmen nach dem Ende von Windows 7 im Januar weiterhin auf Windows 10 umsteigen. Windows 8.1 ist stabil bei rund 4%
Was bedeutet das für mich als Entwickler?
Sie müssen mehr denn je sicherstellen, dass Ihre Anwendungen Windows 10-fähig sind. Windows 10 hat als Reaktion auf eine Reihe von Hardware-Innovationen und Verwendungsmustern grundlegende Anpassungen an der Benutzeroberfläche vorgenommen. Dies umfasst Anpassungen für die PerMonitor-Unterstützung für verschiedene Auflösungen und DPIs sowie die Verbesserungen für die HighDPI-Unterstützung.
HighDPI-Unterstützung ist kein optionales Element mehr. Ohne sie kann Ihre Anwendung auf bestimmten Bildschirmen unbrauchbar werden und die Endbenutzererfahrung wird darunter leiden.
Es gibt jedoch immer noch einen Grund für die Abwärtskompatibilität mit älteren Windows-Versionen. (Etwas, das die VCL bei der Implementierung der neuen Windows 10-Steuerelemente unterstützt – JA – Sie können es dann unter Windows 7 und Windows 8 ausführen, wenn Sie die VCL verwenden.)
Weitere Informationen zu Windows 10 und einigen der neuen Steuerelemente und Windows 10-Funktionen in RAD Studio für Delphi und C ++ Builder finden Sie in diesem Blogbeitrag zu den 5 einzigartigen Funktionen für Windows 10 .
Wenn es um die Art der Geräte auf der mobilen Seite geht, sind es mobile (50,33%) und Desktop-Geräte (47,04%), wobei Tablets nur 2,63% des Marktanteils ausmachen
Dies bedeutet, dass Android (und auch iOS) eine wichtige Plattform und ein technischer Vorteil sind, um die technischen Funktionen Ihrer Desktop-Anwendungen zu erweitern. Diese Eintrittsbarriere ist gering, da die Akzeptanz hoch ist. Dies macht es zu einem idealen Ziel, um Ihr Produktangebot zu verbessern und die Entwicklungsrendite zu maximieren.
Da mehr mobile Geräte als Desktops verwendet werden, können Mobiltelefone bei Produktinnovationen nicht ignoriert werden. Mobile Geräte bieten Entwicklern wichtige technische Funktionen. B. Kamera, Beschleunigungsmesser, Kompass usw. und in Verbindung mit Desktop-Lösungen innovative Möglichkeiten für die Datenerfassung ermöglichen.
Da die Kernsystembibliotheken in Delphi plattformübergreifend sind, können Sie Ihre mobile Entwicklung auch mithilfe einer einzigen Codebasis beschleunigen. Große Teile der Geschäftslogik können schnell von Windows auf iOS und Android übertragen werden.
Es lohnt sich auch, sich die Enterprise-Version von Delphi anzusehen, um Zugriff auf InterBase ToGo für Handys als lizenzfreie Laufzeitdatenbank zu erhalten. Die vollständige Verschlüsselung der Datenbank auf der Festplatte bietet das höchste Maß an Datensicherheit, das normalerweise für Unternehmensserver reserviert ist und sich dennoch in einer hochverteilbaren Datenbank mit geringem Platzbedarf befindet.
Wenn Sie ein Mobiltelefon neben einer lokalen Anwendung verwenden möchten (und die Daten nicht zuerst zentral für die Verarbeitung benötigt werden), ist der einzigartige Ansatz von AppTethering auf jeden Fall einen Blick wert. AppTethering vermeidet die Notwendigkeit, Daten auf einen zentralen Server zu übertragen, wodurch sie schneller werden (da die Daten lokal sind). Wenn dies von Interesse ist, schauen Sie sich auf jeden Fall diese Webinar-Wiederholung an .
Alternativ ist RAD Server eine hervorragende Möglichkeit, vorhandene Geschäftslogik als Remote-API zugänglich zu machen. Klicken Sie hier, um weitere Blogs auf RAD Server anzuzeigen
Regionale spezifische Trends
Wenn Sie sich eingehender mit regionalen Trends befassen möchten, empfehlen wir Ihnen , StatCounter zu besuchen und die interaktiven Chats zu verwenden, die von Fusion Charts (die kürzlich auch Mitglied der Idera-Gruppe wurden) unterstützt werden.
Tue Oct 27 2020 10:23:36 GMT+0700 (Western Indonesia Time)
Welcome! I’m glad you’re here again for some more Dart and Flutter magic.
✨ In the previous episode of this series, we looked at Dart and went from basically zero to hero with all those types, classes and asynchrony. I hope you had enough practice on Dart because today, we’ll move forward to Flutter. Let’s get started!
Quick heads up: the “👉” emoji will compare JS and React with Dart and Flutter language examples as of now. Just like in the previous episode,, the left side will be the JS/React, and the right side will be the Dart/Flutter equivalent, e.g. console.log("hi!"); 👉 print("hello!");
What is Flutter, and why we’ll use it
Flutter and Dart are both made by Google. While Dart is a programming language, Flutter is a UI toolkit that can compile to native Android and iOS code. Flutter has experimental web and desktop app support, and it’s the native framework for building apps for Google’s Fuchsia OS.
This means that you don’t need to worry about the platform, and you can focus on the product itself. The compiled app is always native code as Dart compiles to ARM, hence providing you the best cross-platform performance you can get right now with over 60 fps.
Flutter also helps the fast development cycle with stateful hot reload, which we’ll make use of mostly in the last episode of this series.
Intro to the Flutter CLI
When building apps with Flutter, one of the main tools on your belt is the Flutter CLI. With the CLI, you can create new Flutter projects, run tests on them, build them, and run them on your simulators or emulators. The CLI is available on Windows, Linux, macOS and x64-based ChromeOS systems.
Once you have the CLI installed, you’ll also need either Android Studio, Xcode, or both, depending on your desired target platform(s).
(Flutter is also available on the web and for desktop, but they are still experimental, so this tutorial will only cover the Android and iOS related parts).
If you don’t wish to use Android Studio for development, I recommend VSCode. You can also install the Dart and Flutter plugins for Visual Studio Code.
Once you’re all set with all these new software, you should be able to run flutter doctor. This utility will check if everything is working properly on your machine. At the time of writing, Flutter printed this into the console for me:
[✓] Flutter (Channel stable, v1.17.4, on Mac OS X 10.15.4 19E287, locale en-HU)
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
[✓] Xcode - develop for iOS and macOS (Xcode 11.5)
[!] Android Studio (version 3.5)
✗ Flutter plugin not installed; this adds Flutter specific functionality.
✗ Dart plugin not installed; this adds Dart specific functionality.
[✓] VS Code (version 1.46.1)
[!] Connected device
! No devices available
You should get similar results for at least for the Flutter part too. Everything else depends on your desired target platforms and your preferred IDEs like Android Studio or VS Code. If you get an X for something, check again if everything is set up properly.
Only move forward in this tutorial if everything works properly.
To create a new Flutter project, cd into your preferred working directory, and run flutter create <projectname>. The CLI will create a directory and place the project files in there. If you use VS Code on macOS with an iOS target, you can use this little snippet to speed up your development process:
# Create a new project
flutter create <projectname>
# move there
cd projectname
# open VS code editor
code .
# open iOS Simulator - be patient, it may take a while
open -a Simulator.app
# start running the app
flutter run
And boom, you’re all set! 💅
If you don’t wish to use the iOS simulator, you can always spin up your Android Studio emulator. Use Genymotion (or any other Android emulation software), or even connect a real device to your machine. This is a slower and more error-prone solution, so I recommend to only test on real devices when necessary.
Once they have booted, you can run flutter doctor again and see if Flutter sees the connected device. You should get an output something just like this:
...
[✓] Connected device (1 available)
...
If you got this output - congratulations! 🎉 You’re all set to move on with this tutorial. If, for some reason Flutter didn’t recognize your device, please go back and check everything again as you won’t be able to follow the instructions from now on.
Hello world! 🌍
If you didn’t run the magic snippet previously, run these commands now:
# Create a new project
flutter create <projectname>
# move there
cd projectname
# open VS code editor (optional if you use Studio)
code .
# start running the app
flutter run
This will spin up the Flutter development server with stateful hot reload and a lot more for you. You’ll see, that by default, Flutter creates a project with a floating action button and a counter:
Once you’re finished with playing around the counter, let’s dig into the code! 👨💻
Flutter project structure
Before we dig right into the code, let’s take a look at the project structure of our Flutter app for a moment:
├── README.md
├── android
│ └── ton of stuff going on here...
├── build
│ └── ton of stuff going on here...
├── ios
│ └── ton of stuff going on here...
├── lib
│ └── main.dart
├── pubspec.lock
├── pubspec.yaml
└── test
└── widget_test.dart
We have a few platform-specific directories: android and ios. These contain the necessary stuff for building, like the AndroidManifest, build.gradle, or your xcodeproj.
At this moment, we don’t need to modify the contents of these directories so we’ll ignore them for now. We’ll also ignore the test directory as we won’t cover testing Flutter in this series (but we may look into it later if there’s interest 👀), so that only leaves us to these:
And this is where the magic happens. Inside the lib directory, you have the main.dart: that’s where all the code lives right now. We’ll peek into it later, but let’s just have a look at the pubspec.yaml and pubspec.lock.
What are those?
Package management in Flutter - pub.dev
When building a project with JavaScript, we often use third party components, modules, packages, libraries, and frameworks so that we don’t have to reinvent the wheel. The JavaScript ecosystem has npm and yarn to provide you with all those spicy zeroes and ones, and they also handle the dependencies inside your project.
In the Dart ecosystem, this is all handled by pub.dev.
So, just a few quick facts: npm 👉 pub.dev package.json 👉 pubspec.yaml package-lock.json 👉 pubspec.lock
We’ll look into installing packages and importing them into our app in the last episode of this series, in which we’ll create a fun mini-game.
Digging into the Dart code
The only thing left from the file tree is main.dart. main is the heart of our app, it’s like the index.js of most JS-based projects. By default, when creating a project with flutter create, you’ll get a very well documented code with a StatelessWidget, a StatefulWidget, and its State.
So instead of observing the demo code line by line together, I encourage you to read the generated code and comments by yourself and come back here later.
In the next part, we’ll look into what are widgets and the build method.
We’ll learn why it is @overrided, and what’s the difference between stateful and stateless widgets. Then we’ll delete all the code from main.dart and create a Hello world app by ourselves so that you can get the hang of writing declarative UI code in Flutter.
Go ahead, read the generated code and the documentation now! 👀
In Flutter, everything is a widget!
As you have been reading the code, you may have noticed a few things. The first thing after importing Flutter is the entry method I have been talking about in the previous episode:
void main() {
runApp(MyApp());
}
And then, you could see all those classes and OOP stuff come back with the line class MyApp extends StatelessWidget.
First things first: in Flutter, everything is a widget!
Oh, and speaking of widgets. Components 👉 Widgets!
The StatelessWidget is a class from the Flutter framework, and it’s a type of widget. Another kind of widget is StatefulWidget and we’ll look into the difference between those and how to use them later.
We can create our reusable widget by extending the base class StatelessWidget with our own build method. (By the way, render in ReactJS 👉 build in Flutter). We can see that the build returns a Widget because the return type is defined, and we can see an odd keyword in the previous line: @override.
It’s needed because the StatelessWidget class has a definition for build by default, but we want to replace it (or override it) with our own implementation - hence the keyword @override. Before we dig further into the code, let’s have a peek at using widgets in Flutter:
// using a React component
<button onClick={() => console.log(‘clicked!’)}>Hi, I’m a button</button>
// using a Flutter widget
RawMaterialButton(
onPressed: () {
print("hi, i'm pressed");
},
child: Text("press me!"),
),
You can see that Flutter has a different approach with declarative UI code.
Instead of wrapping children between ><s and passing props next to the component name (e.g. <button onClick ...), everything is treated as a property. This enables Flutter to create more flexible and well-typed widgets: we’ll always know if a child is supposed to be a standalone widget or if it can accept multiple widgets as a property, for example. This will come in handy later when we’ll build layouts with Rows and Columns.
Now that we know a bit more about widgets in Flutter, let’s take a look at the generated code again:
The build method returns a MaterialApp that has a type of Widget and - unsurprisingly - comes from Flutter. This MaterialApp widget is a skeleton for your Flutter app. It contains all the routes, theme data, metadata, locales, and other app-level black magic you want to have set up. 🧙
You can see the MyHomePage class being referenced as the home screen. It also has a property, title, set up. MyHomePage is also a widget, and we can confirm that by looking at the definition of this class.
Quick tip: if you are using VSCode as your editor, hold Command and hover or click on the class reference and you’ll be directed to the code of the class.
We can see that MyHomePage extends a StatefulWidget. However, the structure of the code itself is a bit squiggly and weird. What’s this MyHomePage({Key key, this.title}) : super(key: key); syntax? Why doesn’t this widget have a build method? What’s a State? What is createState?
To answer these questions, we’ll have to look into one of the more hard-code topics in Flutter: state management.
Local state management in Flutter: StatefulWidgets
I previously talked about the two main types of widgets in Flutter: StatelessWidgets and StatefulWidgets. StatelessWidgets are pretty straightforward: a snippet of code that returns a Widget, maybe some properties are being passed around, but that’s all complexity.
However, we don’t want to write applications that just display stuff! We want to add interactivity! And most interactions come with some state, whether it’s the data stored in an input field or some basic counter somewhere in your app. And once the state is updated, we want to re-render the affected widgets in our app - so that the new data is being displayed for the user.
Think of state management in React: it has the very same purpose with the goal of being as efficient as possible. It’s no different in Flutter: we want to have some very simple widgets (or StatelessWidgets), and some widgets with a bit of complexity and interactivity (or StatefulWidgets).
Let’s dive into the code: a StatefulWidget consists of two main components:
a StatefulWidget (that is called MyHomePage in our case)
a typed State object (that is called _MyHomePageState in this example)
We’ll call these “widget” and “state” (respectively) for the sake of simplicity. The widget itself contains all the props, and a createState overridden method. As you can see, the prop is marked with a final - that’s because you cannot change the prop from within the widget. When you modify a prop of a widget, Flutter throws the current instance away and creates a brand new StatefulWidget.
Note that changing either the prop or the state will trigger a rebuild in Flutter - the key difference between the two is that changing the state can be initiated from within the widget while changing a prop is initiated by the parent widget.
Props help you pass data from parent to children. State helps you handle data change inside the children.
Now, let’s look into changing the state: inside the widget, we have a createState method that only returns the state, _MyHomePageState(). When modifying the state with the setState method, this createState method gets called and returns a new instance of your state. The old instance gets thrown away, and a new instance of your widget will be inserted into the widget tree.
(Sidenote: the widget tree is only a blueprint of your app, the element tree is the one that gets rendered for the user. It’s a bit more advanced, under-the-hood topic, so it won’t be covered in this series - however, I’ll link some video resources later on that will help you understand how Flutter works and what’s the deal with the widget tree and the element tree.)
The _MyHomePageState class has a type of State, typed with MyHomePage.
This is needed so that you can access the properties set in the MyHomePage instance with the widget keyword - for example, to access the title prop, write widget.title. Inside the state, you have an overridden build method, just like you’d see in a typical StatelessWidget. This method returns a widget that renders some nice data, both from props (widget.title) and from the state (_counter).
Notice that you don’t need to type in anything before the _counter. No this.state._counter, no State.of(context)._counter, just a plain old _counter. That’s because from the perspective of the code, this variable is declared just like any other would be:
int _counter = 0;
However, when modifying this variable, we need to wrap our code in setState, like this:
setState(() {
_counter++;
});
This will tell Flutter that “Hey! It’s time to re-render me!”.
The framework will call the previously discussed createState method; a new instance of your state gets created; built; rendered; and boom! 💥 The new data is now on-screen.
It may seem a bit complicated or seem like you have to write a lot of boilerplate code to get this running. But don’t worry! With VS Code, you can refactor any StatelessWidget into a stateful one with just one click:
And that’s it for managing your widget’s state! It may be a lot at first, but you’ll get used to it after building a few widgets.
A few notes about global state management in Flutter
Right now, we only looked at working with local state in Flutter - handling app-level, or global state is a bit more complex. There are, just like in JS, tons of solutions, ranging from the built-in InheritedWidget to a number of third-party state management libraries. Some of those may already be familiar, for example, there is RxDart and Redux, just to name a few. To learn more about the most popular solutions, and which one to choose for your project, I suggest you watch this awesome video about global state management in Flutter by Fireship.
Widgets, widgets, and widgets
I already talked about how everything is a widget in Flutter - however, I didn’t really introduce you to some of the most useful and popular widgets in Flutter, so let’s have a look at them before we move on!
Flutter has widgets for displaying texts, buttons, native controls like switches and sliders (cupertino for iOS and material for Android style widgets), layout widgets like Stack, Row, Column and more. There are literally hundreds of widgets that are available for you out of the box, and the list keeps growing.
The whole widget library can be found here in the Widget Catalog, and the Flutter team is also working on a very nice video series with new episodes being released weekly. This series is called Flutter Widget of the Week, and they introduce you to a Flutter widget, it’s use cases, show you code examples and more, in just about one minute! It’s really binge-worthy if you want to get to know some useful Flutter widgets, tips, and tricks.
As you’ll work with Flutter, you’ll explore more and more widgets, but there are some basic Flutter widgets you’ll absolutely need to build your first application. (We’ll probably use most of them in the next and last episode of this series, so stay tuned!)
First and foremost: Text.
The Text widget delivers what its name promises: you can display strings with it. You can also style or format your text and even make multiline texts. (There’s are a lot of line of text-related widgets available, covering your needs from displaying rich text fields to creating selectable texts.)
An example Text widget in Flutter:
Text('hello world!'),
Adding buttons to your Flutter app is also easy as one two three. There are numerous button-related widgets available for you ranging from RawMaterialButton to FlatButton, IconButton, and RaisedButton, and there are also specific widgets for creating FloatingActionButtons and OutlineButtons. I randomly picked 🎲 the RaisedButton for us so that we can have a peek at how easy it is to add a nice, stylish button into our app:
RaisedButton(
onPressed: () {
print(
"hi! it's me, the button, speaking via the console. over.",
);
},
child: Text("press meeeeeee"),
),
Building layouts in Flutter
When building flexible and complex layouts on the web and in React-Native, the most important tool you used was flexbox. While Flutter isn’t a web-based UI library and hence lacks flexbox, the main concept of using flexible containers with directions and whatnot is implemented and preferred in Flutter. It can be achieved by using Rows and Columns, and you can stack widgets on each other by using Stacks.
Consider the following cheatsheet I made:
Remember how I previously praised typing the props of a widget and how it’s one of the best tools in Flutter’s declarative UI pattern? The Row, Column and Stack widgets all have a children property that want an array of widgets, or [Widget]. Lucky for you, the VS Code automatically completes the code for you once you start working with these widgets:
Just hit tab to let Code complete the code for you! Maybe in the future, you won’t need to write code at all, Flutter will just suck out the app idea out of your brain and compile that - but until then, get used to hitting tab.
Let’s look at an example where we display some names underneath each other:
You can see that you create a typed list with the <Widget>[] syntax, you pass it as a prop for the Column, create some amazing widgets inside the list, and boom! The children will be displayed underneath each other. Don’t believe me? Believe this amazing screenshot. 📸
Alignment
The real power of Columns and Rows isn’t just placing stuff next to each other, just like flexbox isn’t only about flex-direction either. In Flutter, you can align the children of a Column and Row on two axes, mainAxis and crossAxis.
These two properties are contextual: whilst in a Row, the main axis would be horizontal, and the crossing axis would be vertical, it would be switched in a Column. To help you better understand this axis concept, I created a handy cheat sheet with code examples and more.
So, for example, if you want to perfectly center something, you’d want to use either the Center widget; or a Row or Column with both mainAxisAlignment and crossAxisAlignment set to .center; or a Row and Column with their mainAxisAlignments set to .center. The possibilities are basically endless with these widgets! ✨
Rendering lists (FlatLists 👉 ListViews)
Whilst thinking about possible use cases for columns, you may have wondered about creating scrollable, dynamic, reorderable, or endless lists.
While these features could be achieved by using Columns, it would take a lot of effort to do so, not even mentioning updating your list data or lazy rendering widgets when there’s a crapton of data. Lucky you, Flutter has a class for rendering lists of data, and it’s called a ListView!
There are several ways to use a ListView, but the most important ones are the ListView(...) widget and the ListView.builder method. Both of them achieve the very same functionality from the perspective of the user, but programmatically, they differ big time.
First, let’s look into the ListView(..) widget. Syntactically, they are very similar to a Column except that they lack the main and cross-axis alignment properties. To continue on with our previous example for columns when we placed names under each other, I’ll display the very same column converted into a ListView:
Tada! 🎉 Your first ListView in Flutter! When refreshing or rebuilding the app (by either pressing a small or capital R in the Flutter CLI), you’ll see the very same thing you saw previously.
However, if you try to drag it, you are now able to scroll inside the container! Note that when a Column has bigger children than its bounds, it will overflow, but a ListView will be scrollable.
ListView builder
While the ListView widget is cool and good, it may not be suitable for every use case. For example, when displaying a list of tasks in a todo app, you won’t exactly know the number of items in your list while writing the code, and it may even change over time. Sure, you are able to run .map on the data source, return widgets as results, and then spread it with the ... operator, but that obviously wouldn’t be performant, nor is it a good practice for long lists. Instead, Flutter provides us a really nice ListView builder.
Sidenote: while working with Flutter, you’ll see the word “builder” a lot. For example, in places like FutureBuilder, StreamBuilder, AnimatedBuilder, the build method, the ListView builder, and more. It’s just a fancy word for methods that return a Widget or [Widget], don’t let this word intimidate or confuse you!
So how do we work with this awesome method? First, you should have an array or list that the builder can iterate over. I’ll quickly define an array with some names in it:
final List<String> source = ["Sarah", "Mac", "Jane", "Daniel"];
And then, somewhere in your widget tree, you should be able to call the ListView.builder method, provide some properties, and you’ll be good to go:
Oh, and notice how I was able to use an arrow function, just like in JavaScript!
The itemCount parameter is not required, but it’s recommended. Flutter will be able to optimize your app better if you provide this parameter. You can also limit the maximum number of rendered items by providing a number smaller than the length of your data source.
When in doubt, you can always have a peek at the documentation of a class, method, or widget by hovering over its name in your editor:
And that sums up the layout and list-related part of this episode. We’ll look into providing “stylesheets” (or theme data) for your app, look at some basic routing (or navigation) methods, and fetch some data from the interwebs with HTTP requests.
Theming in Flutter
While building larger applications with custom UI components, you may want to create stylesheets. In Flutter, they are called Themes, and they can be used in a lot of places. For example, you can set a default app color, and then the selected texts, buttons, ripple animations, and more will follow this color. You can also set up text styles (like headings and more), and you’ll be able to access these styles across the app.
To do so, you should provide a theme property for your MaterialApp at the root level of the application. Here’s an example:
return MaterialApp(
title: 'RisingStack Flutter Demo',
theme: ThemeData(
// Define the default brightness and colors.
brightness: Brightness.light,
primaryColor: Colors.green[300],
accentColor: Colors.green,
// Define button theme
buttonTheme: ButtonThemeData(
buttonColor: Colors.green,
shape: CircleBorder(),
),
// Define the default font family
// (this won’t work as we won’t have this font asset yet)
fontFamily: 'Montserrat',
// Define the default TextTheme. Use this to specify the default
// text styling for headlines, titles, bodies of text, and more.
textTheme: TextTheme(
headline1: TextStyle(fontSize: 72.0, fontWeight: FontWeight.bold),
headline6: TextStyle(fontSize: 36.0, fontStyle: FontStyle.italic),
bodyText2: TextStyle(fontSize: 14.0, fontFamily: 'Muli'),
),
),
home: Scaffold(...),
);
These colors will be used throughout our app, and accessing the text themes is also simple as a pickle! I added a RaisedButton on top of the app so that we can see the new ButtonThemeData being applied to it:
It’s ugly and all, but it’s ours! 🍋 Applying the text style won’t be automatic, though. As we previously discussed, Flutter can’t really read your mind, so you explicitly need to tag Text widgets as a headline1 or bodyText2, for example.
To do so, you’ll use the Theme.of(context) method. This will look up the widget tree for the nearest Theme providing widget (and note that you can create custom or local themes for subparts of your app with the Theme widget!) and return that theme. Let’s look at an example:
You can see that we are accessing the theme with the Theme.of(context) method, and then we are just accessing properties like it’s an object. This is all you need to know about theming a Flutter app as it really isn’t a complex topic!
Designing mobile navigation experiences
On the web, when managing different screens of the app, we used paths (e.g. fancysite.com/registration) and routing (e.g., react-router) to handle navigating back and forth the app. In a mobile app, it works a bit differently, so I’ll first introduce you to navigation on mobile, and then we’ll look into implementing it in Flutter.
Mobile navigation differs from the web in a lot of ways. Gestures and animations play a very heavy role in structuring out the hierarchy of the app for your user. For example, when a user navigates to a new screen, and it slides in from the right side of the screen, the user will expect to be able to move back with a slide from the left. Users also don’t expect flashy loadings and empty screens when navigating - and even though there are advancements on the web in this segment (e.g. PWAs), it’s by far not the default experience when using websites.
There are also different hierarchies when designing mobile apps. The three main groups are:
Hierarchical Navigation(e.g. the Settings app on iOS)
New screens slide in from left to right. The expected behavior for navigating back is with a back button on the upper left corner and by swiping from the left edge of the screen to the right.
Flat Navigation(e.g. the Apple Music app)
The default behavior for this hierarchy is a tab bar on the bottom.
Tabs should always preserve location (e.g. if you navigate to a subscreen inside on tab one, switch to tab two and switch back to tab one, you’d expect to be on the subscreen, not on the root level screen.)
Swiping between tabs is optional. It isn’t the default behavior and it may conflict with other gestures on the screen itself - be cautious and think twice before implementing swipeable tab bars.
Custom, content-driven, or experimental navigation(Games, books and other content)
When making experimental navigation, always try to be sane with the navigation. The user should always be able to navigate back and undo stuff.
I created a handy cheat sheet for you that will remind you of the most important things when in doubt:
Also, all of these can be mixed together, and other screens like modals can be added to the stack. Always try to KISS and make sure that the user can always navigate back and undo things. Don’t try to reinvent the wheel with navigation (e.g., reverse the direction of opening up a new screen) as it will just confuse the user.
Also, always indicate where the user is in the hierarchy (e.g., with labeling buttons, app title bar, coloring the bottom bar icons, showing little dots, etc.). If you want to know more about designing mobile navigation experiences and implementing them in a way that feels natural to the user, check out Apple’s Human Interface Guideline’s related articles.
Navigation in Flutter
When routing on the web with React or React-Native, you had to depend on third-party libraries to get the dirty work done for you (e.g. react-router). Luckily, Flutter has native navigation capabilities out of the box, and they cover every need of most of the apps, and they are provided to you via the Navigator API.
The applications of this API and the possibilities to play around with navigation are endless. You can, for example, animate a widget between screens; build a bottom navigation bar or a hamburger menu; pass arguments; or send data back and forth. You can explore every navigation-related Flutter cookbook here. In this series, we’ll only look into initializing two screens, navigating between them, and sharing some widgets between them.
To get started with navigation, let’s create two widgets that we’ll use as screens and pass the first into a MaterialApp as the home property:
This was easy as a breeze. If you run this app in a simulator, you’ll see “hey! 👋” on the center of the screen. Now, inside the MaterialApp, we can define our routes:
And now, we can navigate the user to the next screen when the button is pressed. Notice that I replaced the Center with a Column with both its main and cross axises centered. This was required because I wanted to have two children underneath each other: a Text and a RaisedButton. Inside the RaisedButton, we only have to push the route to the stack and let Flutter handle the routing and animation:
Navigator.pushNamed(context, '/hi');
By default, we can navigate back to the previous screen by swiping from the left edge of the screen. This is the expected behavior, and we don’t intend to change it, so we’ll leave it as it is. If you want to add a button on the second screen to navigate back to the first screen, you can use Navigator.pop(); method.
Don’t ever push to the same screen the user is on, nor the previous screen. Always use pop when navigating backward.
This will be just enough to cover your basic navigation needs. Don’t forget, if you want to check out more advanced navigation features such as animating widgets between screens or passing data back and forth, check out the related Flutter cookbooks.
Networking, HTTP requests
Now that you can build widgets, layouts, display lists, and you can navigate between screens with Flutter, there’s only one thing left: communicating with your backend API. One of the most popular BaaS providers for mobile and Flutter is Firebase by Google. It allows you to use real-time databases, push notifications, crash reporting, app analytics, and a lot more out of the box. You can find the Flutter Firebase packages on pub.dev or you can follow this step-by-step tutorial.
If you are a more experienced developer and you have a complex project with a custom backend in mind, or if you are just genuinely looking forward to using your own selection of backend APIs - Firebase just won’t suit your needs.
Just add it into your dependency list inside the pubspec.yaml, wait until flutter pub get finishes (VSCode automatically runs it for you if it detects changes in the pubspec.yaml), and then continue reading:
dependencies:
flutter:
sdk: flutter
http: any
http is a Future-based library for making HTTP requests. To get started with it, just import it:
import 'package:http/http.dart' as http;
And then, you can start making requests with top-level methods like http.post or http.get. To help you experiment with making HTTP requests in Flutter, I have made a demo API that you can GET on. It will return some names and ages. You can access it here (https://demo-flutter-api.herokuapp.com/people).
Parsing JSON data in Flutter and Dart
After making your GET request on the API, you’ll be able to get data out of it by accessing properties like this:
void request() async {
final response =
await http.get("https://demo-flutter-api.herokuapp.com/people");
print(response.body); // => [{"name":"Leo","age":17},{"name":"Isabella","age":30},{"name":"Michael","age":23},{"name":"Sarah","age":12}]
print(json.decode(response.body)[0]["name"]); // => Leo
}
However, this solution should not be used in production. Not only it lacks automatic code completion and developer tooling, but it’s very error-prone and not really well documented. It’s just straight-up crap coding. 💩
Instead, you should always create a Dart class with the desired data structure for your response object and then process the raw body into a native Dart object. Since we are receiving an array of objects, in Dart, we’ll create a typed List with a custom class. I’ll name the class Person, and it will have two properties: a name (with a type of String) and age (int). I’ll also want to define a .fromJson constructor on it so that we can set up our class to be able to construct itself from a raw JSON string.
First, you’ll want to import dart:convert to access native JSON-related methods like a JSON encoder and decoder:
import 'dart:convert';
Create our very basic class:
class Person {
String name;
int age;
}
Extend it with a simple constructor:
Person({this.name, this.age});
And add in the .fromJson method, tagged with the factory keyword. This keyword informs the compiler that this isn’t a method on the class instance itself. Instead, it will return a new instance of our class:
Notice that I created two separate methods: a fromMap and a fromJson. The fromMap method itself does the dirty work by deconstructing the received Map. The fromJson just parses our JSON string and passes it into the fromMap factory method.
Now, we should just map over our raw response, use the .fromMap factory method, and expect everything to go just fine:
Sidenote: I didn’t use the .fromJson method because we already parsed the body before mapping over it, hence it’s unneeded right now.
There is a lot to unwrap in these few lines! First, we define a typed list and decode the response.body. Then, we map over it, and we throw in the return type <Person> to the map so that Dart will know that we expect to see a Person as a result of the map function. Then, we convert it to a List as otherwise it would be an MappedListIterable.
Rendering the parsed JSON: FutureBuilder and ListView.builder
Now that we have our app up and running with our basic backend, it’s time to render our data. We already discussed the ListView.builder API, so we’ll just work with that.
But before we get into rendering the list itself, we want to handle some state changes: the response may be undefined at the moment of rendering (because it is still loading), and we may get an error as a response. There are several great approaches to wrap your head around handling these states, but we’ll use FutureBuilder now for the sake of practicing using new Flutter widgets.
FutureBuilder is a Flutter widget that takes a Future and a builder as a property. This builder will return the widget we want to render on the different states as the Future progresses.
Note that FutureBuilder handles state changes inside the widget itself, so you can still use it in a StatelessWidget! Since the http package is Future-based, we can just use the http.get method as the Future for our FutureBuilder:
And we should also pass a builder. This builder should be able to respond to three states: loading, done and error. At first, I’ll just throw in a centered CircularProgressIndicator() to see that our app renders something:
If you run this app, you’ll see a progress indicator in the center of the screen running indefinitely. We can get the state of the response by the response.hasData property:
And now, we can be sure that nothing comes between us and processing, then rendering the data, so inside the response.hasData block, we’ll process the raw response with previously discussed parsing and mapping method, then return a ListView.builder:
And that’s it! 🎉 If you run this snippet right now, it will render four names and their corresponding ages next to them. Isn’t this amazing? It may have seemed like a lot of work for a simple list like this, but don’t forget that we created a whole-blown class, parsed JSON, and converted it into class instances, and we even handled loading and error states.
Summing it all up
Congratulations on making it this far into the course! You have learned a lot and came along a long way since we started in the previous episode.
You went from zero to hero both with Dart (types, control flow statements, data structures, OOP, and asynchrony) and Flutter (CLI, widgets, alignment, lists, themes, navigation and networking).
¡Windows 10 ahora es utilizado por 3 de cada 4 máquinas de escritorio con Windows! Esta participación de mercado aumentó alrededor del 10% en 2020, habiendo superado originalmente a Windows 7 a fines de 2017.
Windows 7 ha bajado a alrededor del 18% y está cayendo. En parte, porque las empresas continúan cambiando a Windows 10 después de que Windows 7 finalice su vida útil en enero. Windows 8.1 es estable alrededor del 4%
¿Qué significa para mí como desarrollador?
Debe asegurarse de que sus aplicaciones estén preparadas para Windows 10 más que nunca. Windows 10 ha realizado ajustes fundamentales en la capa de la interfaz de usuario como reacción a una serie de innovaciones de hardware y patrones de uso. Esto incluye ajustes para la compatibilidad con PerMonitor para diferentes resoluciones y DPI, y las mejoras relacionadas con la compatibilidad con HighDPI.
El soporte HighDPI ya no es un elemento opcional, sin él, su aplicación podría quedar inutilizable en ciertas pantallas y la experiencia del usuario final se verá afectada.
Dicho esto, todavía hay una razón para tener compatibilidad con versiones anteriores de Windows. (Algo que la VCL ayuda a respaldar con la implementación de los nuevos controles de Windows 10, SÍ, puede ejecutarlo en Windows 7 y Windows 8 si usa la VCL)
Para obtener más información sobre Windows 10 y algunos de los nuevos controles y características de Windows 10 en RAD Studio para Delphi y C ++ Builder, esta publicación de blog de 5 características únicas para Windows 10 es un buen resumen.
Cuando se trata del tipo de dispositivos en el lado móvil, es móvil (50,33%) y de escritorio (47,04%) en todo momento, y las tabletas representan solo el 2,63% de la cuota de mercado.
Significa que Android (y también iOS) son una plataforma clave y un activo técnico al que apuntar para expandir las capacidades técnicas de sus aplicaciones de escritorio. Esta barrera de entrada es baja ya que la adopción es alta. Esto lo convierte en un objetivo ideal para mejorar su oferta de productos y maximizar el rendimiento del desarrollo.
Con más dispositivos móviles en uso que computadoras de escritorio, los teléfonos móviles no pueden ignorarse cuando se trata de innovación de productos. Los dispositivos móviles ofrecen al desarrollador un conjunto diferente de capacidades técnicas clave. p.ej. Cámara, acelerómetro, brújula, etc., y cuando se combinan con las soluciones de escritorio, permiten formas innovadoras de capturar datos.
Dado que las bibliotecas centrales del sistema en Delphi son multiplataforma, significa que puede realizar un seguimiento rápido de su desarrollo móvil mediante el uso de una única base de código. Gran parte de la lógica empresarial puede pasar de Windows a iOS y Android rápidamente.
También vale la pena mirar la versión Enterprise de Delphi para obtener acceso a InterBase ToGo para dispositivos móviles como una base de datos libre de regalías en tiempo de ejecución. El cifrado completo en disco de la base de datos proporciona el más alto nivel de seguridad de datos, normalmente reservado para servidores empresariales, pero aún dentro de una base de datos de tamaño reducido y altamente distribuible.
Si está buscando usar un dispositivo móvil junto con una aplicación local (y no necesita que los datos se procesen de manera centralizada primero), entonces el enfoque único de AppTethering ciertamente vale la pena. AppTethering evita la necesidad de enviar datos a un servidor central, haciéndolo más rápido (ya que los datos son locales). Si esto te parece interesante, definitivamente echa un vistazo a esta repetición del seminario web.
Alternativamente, RAD Server es una excelente manera de tomar la lógica empresarial existente y hacerla accesible como una API remota. Haga clic para ver más blogs en RAD Server
Tendencias específicas regionales
Si desea profundizar en las tendencias regionales específicas, le sugiero que visite StatCounter y utilice los chats interactivos, impulsados por Fusion Charts (que también se convirtió recientemente en miembro del Grupo Idera)
O Windows 10 agora é usado por 3 em cada 4 computadores desktop com Windows! Esta participação de mercado aumentou cerca de 10% em 2020, tendo originalmente passado do Windows 7 no final de 2017.
O Windows 7 caiu para cerca de 18% e está caindo. Em parte, porque as empresas continuam a mudar para o Windows 10 após o Windows 7 chegar ao fim da vida útil em janeiro. O Windows 8.1 está estável em cerca de 4%
O que isso significa para mim como desenvolvedor?
Você precisa ter certeza de que seus aplicativos estão prontos para o Windows 10 mais do que nunca. O Windows 10 fez ajustes fundamentais na camada de interface do usuário em reação a uma série de inovações de hardware e padrões de uso. Isso inclui ajustes para suporte PerMonitor para diferentes resoluções e DPIs, e as melhorias em torno do suporte HighDPI.
O suporte a HighDPI não é mais um item opcional, sem ele, seu aplicativo poderia ser inutilizado em certas telas e a experiência do usuário final será prejudicada.
Dito isso, ainda há um motivo para ter compatibilidade com versões anteriores do Windows. (Algo que a VCL ajuda a suportar com a implementação dos novos controles do Windows 10 – SIM – você pode executar no Windows 7 e Windows 8 se usar a VCL)
Para saber mais sobre o Windows 10 e alguns dos novos controles e recursos do Windows 10 no RAD Studio para Delphi e C ++ Builder, esta postagem do blog 5 Recursos exclusivos para Windows 10 é um bom resumo.
Isso significa que o Android (e também o iOS) são uma plataforma importante e um ativo técnico para expandir os recursos técnicos de seus aplicativos de desktop. Essa barreira de entrada é baixa, pois a adoção é alta. Isso o torna um alvo ideal para aprimorar sua oferta de produtos e maximizar o retorno do desenvolvimento.
Com mais dispositivos móveis em uso do que desktops, os celulares não podem ser ignorados quando se trata de inovação de produto. Os dispositivos móveis oferecem ao desenvolvedor um conjunto diferente de recursos técnicos. por exemplo. Câmera, acelerômetro, bússola, etc., e quando combinados com soluções de desktop, permitem maneiras inovadoras de fazer a captura de dados.
Com as bibliotecas centrais do sistema em Delphi sendo multiplataforma, isso significa que você pode controlar rapidamente seu desenvolvimento móvel por meio do uso de uma única base de código. Grandes partes da lógica de negócios podem passar do Windows para iOS e Android rapidamente.
Também vale a pena olhar para a versão Enterprise do Delphi para obter acesso ao InterBase ToGo para celular como um banco de dados em tempo de execução livre de royalties. A criptografia completa em disco do banco de dados fornece o mais alto nível de segurança de dados, normalmente reservado para servidores corporativos, mas ainda com uma base de dados pequena e altamente distribuível.
Se você deseja usar um dispositivo móvel junto com um aplicativo local (e não precisa que os dados sejam centralizados primeiro para processamento), certamente vale a pena dar uma olhada na abordagem exclusiva do AppTethering. O AppTethering evita a necessidade de enviar dados para um servidor central, tornando-o mais rápido (já que os dados são locais). Se isso lhe parece interessante, então confira a repetição deste webinar.
Como alternativa, o RAD Server é uma ótima maneira de tornar a lógica de negócios existente e torná-la acessível como uma API remota. Clique para mais blogs no servidor RAD
Tendências Específicas Regionais
Se você quiser se aprofundar nas tendências específicas da região, sugiro visitar o StatCounter e usar os bate-papos interativos, com tecnologia Fusion Charts (que também recentemente se tornou membro do Grupo Idera)
Tue Oct 27 2020 01:39:24 GMT+0700 (Western Indonesia Time)
Обновление ключевых целевых платформ Я хотел поделиться некоторыми интересными данными после недавней презентации, посвященной разработке современных Windows.
75% рабочих столов с Windows используют Windows 10!
Windows 10 теперь используется на 3 из каждых 4 настольных компьютеров с Windows! Эта доля рынка вырастет примерно на 10% в 2020 году по сравнению с Windows 7 еще в конце 2017 года.
Windows 7 упала примерно до 18% и продолжает падать. Частично по мере того, как предприятия продолжают переходить на Windows 10 после того, как Windows 7 закончится в январе. Windows 8.1 стабильна на уровне около 4%
Что это значит для меня как разработчика?
Вы должны быть уверены, что ваши приложения готовы к Windows 10 как никогда. Windows 10 внесла фундаментальные изменения в уровень пользовательского интерфейса в ответ на ряд инноваций в оборудовании и схемах использования. Это включает в себя настройки поддержки PerMonitor для различных разрешений и DPI, а также улучшения, связанные с поддержкой HighDPI.
Поддержка HighDPI больше не является необязательным элементом, без нее ваше приложение может стать непригодным для использования на определенных экранах, что ухудшит работу конечного пользователя.
Тем не менее, все еще есть причина для обеспечения обратной совместимости со старыми версиями Windows. (Что-то, что VCL помогает поддерживать с его реализацией новых элементов управления Windows 10 — ДА — вы можете запустить затем в Windows 7 и Windows 8, если вы используете VCL)
Чтобы узнать больше о Windows 10, а также о некоторых новых элементах управления и функциях Windows 10 в RAD Studio для Delphi и C ++ Builder, этот пост в блоге «5 уникальных функций для Windows 10» представляет собой хорошее резюме.
Что касается мобильных устройств, то это мобильные устройства (50,33%) и настольные компьютеры (47,04%), при этом на планшеты приходится всего 2,63% доли рынка.
Это означает, что Android (а также iOS) являются ключевой платформой и техническим активом, на который можно нацелить расширение технических возможностей ваших настольных приложений. Этот барьер для входа низкий, поскольку уровень принятия высок. Это делает его идеальной целью для расширения предложения продуктов и увеличения отдачи от разработки.
Поскольку мобильных устройств используется больше, чем настольных компьютеров, мобильные устройства нельзя игнорировать, когда дело касается инновационных продуктов. Мобильные устройства предлагают разработчику принципиально иной набор технических возможностей. например Камера, акселерометр, компас и т. Д., А также в сочетании с настольными решениями предоставляют инновационные способы сбора данных.
Поскольку основные системные библиотеки в Delphi являются кросс-платформенными, это означает, что вы можете быстро отслеживать разработку мобильных приложений, используя единую базу кода. Значительные части бизнес-логики можно быстро перенести из Windows на iOS и Android.
Также стоит взглянуть на корпоративную версию Delphi, чтобы получить доступ к InterBase ToGo для мобильных устройств в качестве базы данных, не требующей лицензионных отчислений. Полное шифрование базы данных на диске обеспечивает высочайший уровень безопасности данных, обычно зарезервированный для корпоративных серверов, но все же в пределах небольшой, хорошо распространяемой базы данных.
Если вы хотите использовать мобильный телефон вместе с локальным приложением (и вам не нужно, чтобы данные сначала шли централизованно для обработки), то уникальный подход AppTethering, безусловно, заслуживает внимания. AppTethering избавляет от необходимости отправлять данные на центральный сервер, делая его быстрее (поскольку данные являются локальными). Если это звучит интересно, обязательно посмотрите этот повтор вебинара.
В качестве альтернативы RAD Server — отличный способ взять существующую бизнес-логику и сделать ее доступной в виде удаленного API. Нажмите, чтобы увидеть больше блогов на сервере RAD
Региональные тенденции
Если вы хотите глубже вникнуть в региональные тенденции, я бы посоветовал посетить StatCounter и использовать интерактивные чаты на базе Fusion Charts (которая недавно также стала членом Idera Group).
Mon Oct 26 2020 22:23:07 GMT+0700 (Western Indonesia Time)
Embarcadero hat die Docker-Konfigurationen für Linux mit PAServer und mit RAD Server (mit und ohne InterBase) aktualisiert, sodass sie die neueste Version der Installationsprogramme enthalten. Die neuen Docker-Skripte wurden im öffentlichen GitHub-Projekt veröffentlicht unter:
In jedem Repository gibt es einen bestimmten Abschnitt 10.4.1. Die gebrauchsfertigen GitHub-Skripte wurden ebenfalls konfiguriert und sind auf DockerHub an folgenden Speicherorten verfügbar:
Beachten Sie, dass das Basis-Image jedem Linux-Entwickler helfen kann, während der Fokus auf RAD Server liegt, indem PAServer in einem Container installiert wird und der PAServer-Port und die Anmeldeinformationen vollständig angepasst werden. Eine Dokumentation finden Sie in diesem Whitepaper, das die Originalversion der Docker-Skripte abdeckt und im neuen Embarcadero-Kunden-Download-Portal verfügbar ist:
Mon Oct 26 2020 01:38:21 GMT+0700 (Western Indonesia Time)
Embarcadero ha actualizado las configuraciones de Docker para Linux con PAServer y con RAD Server (con y sin InterBase), para que incluyan la última versión de los instaladores. Los nuevos scripts de Docker se han publicado en el proyecto público de GitHub en:
En cada repositorio hay una sección específica de 10.4.1. Los scripts de GitHub listos para usar también se han configurado y están disponibles en DockerHub en las siguientes ubicaciones:
Tenga en cuenta que, si bien el enfoque está en RAD Server, la imagen básica puede ayudar a cualquier desarrollador de Linux, al instalar PAServer en un contenedor, con la personalización completa del puerto PAServer y la información de inicio de sesión. Para obtener documentación, consulte este documento técnico que cubre la versión original de los scripts de la ventana acoplable y está disponible en el nuevo portal de descarga de clientes de Embarcadero:
Mon Oct 26 2020 01:37:28 GMT+0700 (Western Indonesia Time)
A Embarcadero atualizou as configurações do Docker para Linux com PAServer e com RAD Server (com e sem InterBase), para que incluam a última versão dos instaladores. Os novos scripts do Docker foram publicados no projeto público do GitHub em:
Em cada repositório há uma seção 10.4.1 específica. Os scripts GitHub prontos para uso também foram configurados e estão disponíveis no DockerHub nos seguintes locais:
Observe que enquanto o foco está no RAD Server, a imagem básica pode ajudar qualquer desenvolvedor Linux, instalando o PAServer em um container, com total customização da porta PAServer e informações de login. Para obter a documentação, consulte este white paper que cobre a versão original dos scripts do docker e está disponível no novo portal de download de clientes da Embarcadero:
Mon Oct 26 2020 01:37:07 GMT+0700 (Western Indonesia Time)
Embarcadero обновил конфигурации Docker для Linux с помощью PAServer и RAD Server (с InterBase и без него), так что они включают последнюю версию установщиков. Новые скрипты Docker опубликованы в общедоступном проекте GitHub по адресу:
В каждом репозитории есть свой раздел 10.4.1. Готовые к использованию сценарии GitHub также были настроены, и они доступны на DockerHub в следующих местах:
Обратите внимание: хотя основное внимание уделяется RAD Server, базовый образ может помочь любому разработчику Linux, установив PAServer в контейнер с полной настройкой порта PAServer и информации для входа. Для документации, пожалуйста, обратитесь к этому техническому документу, охватывающему исходную версию скриптов докеров и доступному на новом портале загрузки для клиентов Embarcadero:
Fri Oct 23 2020 23:43:39 GMT+0700 (Western Indonesia Time)
EarMaster — это комплексное приложение потребительского уровня с необычайной функциональностью, в котором используется множество различных технологий, в котором учителями музыки созданы почти 3000 уроков для начинающих и профессиональных музыкантов, играющих на любом инструменте. Несмотря на приложение технологически продвинутый бэкенд, команда EarMaster работала жесткий сделать его максимально простым и интуитивно понятным, как можно использовать. EarMaster поддерживает запись и воспроизведение звука, ввод и вывод цифрового интерфейса (MIDI) музыкальных инструментов, инструментальный звуковой сэмплер и многие другие технологии — все это сделано с использованием встроенных фреймворков iOS (AudioUnit, CoreMidi и т. Д.). Он поддерживает Windows и macOS, а также iOS. Он рисует в реальном времени кривые высоты звука на нотном стане на основе определения высоты звука микрофонных записей, обучая музыкантов всех уровней распознавать, транскрибировать и петь мелодии, гаммы, аккорды, интервалы, последовательности аккордов и ритмы.
“We choose Delphi because it allows us to create a true native iOS app, with a GUI using native components, and still share 97 percent of the source code with other platforms,”
Hans Lavdal Jakobsen, managing director and lead developer of EarMaster ApS
https://www.youtube.com/watch?v=uaJQUcgGB_M
“If you develop a multi-platform app, Delphi is simply the fastest way to go.”
Hans Lavdal Jakobsen, managing director and lead developer of EarMaster ApS
Fri Oct 23 2020 23:42:04 GMT+0700 (Western Indonesia Time)
Com quase 3.000 aulas criadas por professores de música para iniciantes a músicos profissionais tocando qualquer instrumento, EarMaster é um aplicativo abrangente para o consumidor com funcionalidade extraordinária que usa uma variedade de tecnologias diferentes. Apesar do back-end tecnologicamente avançado do aplicativo, a equipe EarMaster trabalhou duro para torná-lo o mais simples e intuitivo possível de usar. EarMaster apresenta gravação e reprodução de áudio, entrada e saída de interface digital de instrumento musical (MIDI), sampler de som de instrumento e muitas outras tecnologias – tudo feito com os frameworks iOS nativos (AudioUnit, CoreMidi, etc). Suporta Windows e macOS, bem como iOS. Ele desenha curvas de tom em tempo real em uma equipe musical com base na detecção de tom de gravações de microfone, ensinando músicos de todos os níveis a reconhecer, transcrever e cantar melodias, escalas, acordes, intervalos, progressões de acordes e ritmos.
“We choose Delphi because it allows us to create a true native iOS app, with a GUI using native components, and still share 97 percent of the source code with other platforms,”
Hans Lavdal Jakobsen, managing director and lead developer of EarMaster ApS
https://www.youtube.com/watch?v=uaJQUcgGB_M
“If you develop a multi-platform app, Delphi is simply the fastest way to go.”
Hans Lavdal Jakobsen, managing director and lead developer of EarMaster ApS
Fri Oct 23 2020 23:41:23 GMT+0700 (Western Indonesia Time)
Con casi 3000 lecciones creadas por profesores de música para principiantes y músicos profesionales que tocan cualquier instrumento, EarMaster es una aplicación completa para consumidores con una funcionalidad extraordinaria que utiliza una variedad de tecnologías diferentes. A pesar del backend tecnológicamente avanzado de la aplicación, el equipo de EarMaster trabajó duro para que su uso sea lo más simple e intuitivo posible. EarMaster cuenta con grabación de audio y reproducción de audio, entrada y salida de interfaz digital de instrumentos musicales (MIDI), muestreador de sonido de instrumentos y muchas otras tecnologías, todo hecho con los marcos nativos de iOS (AudioUnit, CoreMidi, etc.). Es compatible con Windows y macOS, así como con iOS. Dibuja curvas de tono en tiempo real en un pentagrama basado en la detección de tono de grabaciones de micrófono, enseñando a los músicos de todos los niveles a reconocer, transcribir y cantar melodías, escalas, acordes, intervalos, progresiones de acordes y ritmos.
“We choose Delphi because it allows us to create a true native iOS app, with a GUI using native components, and still share 97 percent of the source code with other platforms,”
Hans Lavdal Jakobsen, managing director and lead developer of EarMaster ApS
https://www.youtube.com/watch?v=uaJQUcgGB_M
“If you develop a multi-platform app, Delphi is simply the fastest way to go.”
Hans Lavdal Jakobsen, managing director and lead developer of EarMaster ApS
Fri Oct 23 2020 23:40:49 GMT+0700 (Western Indonesia Time)
Mit fast 3.000 Lektionen, die von Musiklehrern für Anfänger bis hin zu professionellen Musikern, die jedes Instrument spielen, erstellt wurden, ist EarMaster eine umfassende, verbrauchergerechte App mit außergewöhnlicher Funktionalität, die eine Vielzahl von verschiedenen Technologien nutzt. Trotz des technologisch fortschrittlichen Backends der App hat das EarMaster-Team hart daran gearbeitet, die Anwendung so einfach und intuitiv wie möglich zu gestalten. EarMaster bietet Audio-Aufnahme und -Wiedergabe, MIDI-Eingang und -Ausgang, Instrumenten-Sound-Sampler und viele andere Technologien – alles mit den nativen iOS-Frameworks (AudioUnit, CoreMidi, etc.) erstellt. Es unterstützt sowohl Windows und macOS als auch iOS. Es zeichnet in Echtzeit Tonhöhenkurven auf einem Notensystem, basierend auf der Tonhöhenerkennung von Mikrofonaufnahmen, und bringt Musikern aller Niveaus bei, Melodien, Skalen, Akkorde, Intervalle, Akkordfolgen und Rhythmen zu erkennen, zu transkribieren und zu singen.
“We choose Delphi because it allows us to create a true native iOS app, with a GUI using native components, and still share 97 percent of the source code with other platforms,”
Hans Lavdal Jakobsen, managing director and lead developer of EarMaster ApS
https://www.youtube.com/watch?v=uaJQUcgGB_M
“If you develop a multi-platform app, Delphi is simply the fastest way to go.”
Hans Lavdal Jakobsen, managing director and lead developer of EarMaster ApS
Fri Oct 23 2020 14:24:07 GMT+0700 (Western Indonesia Time)
Embarcadero Conference 2020 reúne mais de 700 desenvolvedores online ao vivo para um dia de muito conteúdo e solidariedade
Aconteceu nesta terça-feira (20/10) mais uma edição da Embarcadero Conference, o principal evento de desenvolvedores do ano promovido pela Embarcadero. Este ano, devido à pandemia, o evento foi 100% online e toda verba adquirida com a venda de ingressos e patrocínio será revertida em kits de higiene e cestas básicas que serão distribuídos para pessoas em situação de rua e comunidades carentes de São Paulo em uma ação conjunta com grupos de apoio, como o UMA – Um Momento de Amor (@umanasruas), que já faz um trabalho lindo e contínuo.
Foi desafiador levar a dinâmica interativa e imersiva do presencial para o meio digital. Mas todo esforço valeu a pena, o evento foi um grande sucesso! Tivemos adesão em massa de uma incrível comunidade de desenvolvedores, apaixonados pelo Delphi, pelas ferramentas Embarcadero, e, principalmente, por tecnologia. Cerca de 900 pessoas se inscreveram e mais de 700 estiveram online, acompanhando as palestras ao vivo. Além dos números oficiais, nosso alcance se multiplicou por conta do online.
Com o ótimo resultado, conseguiremos levar comida para cerca de 700 lares afetados pela pandemia e distribuiremos cerca de mil kits de higiene para as pessoas em situação de rua. A entrega dos kits de higiene já tem data para acontecer, será nos dias 15 e 29 de Novembro. Aliás, quem quiser participar da distribuição e apoiar não só esta ação, mas também outras, é só entrar em contato com a @umanasruas que será muito bem recebido!
Na próxima semana, dia 27 de outubro, vamos sortear ao vivo kits e licenças para todos os que preencheram a avaliação geral.
Plataforma exclusiva e nova trilha
Para suportar o evento, a empresa contou com um plataforma exclusiva que possibilitou estruturar trilhas paralelas e palestras simultâneas. Ao todo, foram cinco trilhas específicas de conhecimento e 45 palestras durante um dia inteirinho de muito conteúdo mão na massa e interação. Os participantes puderam interagir por meio do chat principal do evento e das salas onde ocorriam as palestras, além de conversar com os patrocinadores em seus stands virtuais.
No palco principal, o keynote foi conduzido por Jim Mckeeth, Chief Developer Advocate & Engineer, Marco Cantù, Delphi Product Manager e David Millington, C++ Product Manager que falaram sobre roadmap, planos para o futuro e responderam todas as dúvidas ao vivo! O engajamento foi enorme, muitas pessoas enviaram suas questões demonstrando interesse no futuro das soluções Embarcadero.
Os MVPs deram um show! Teve até uma demonstração sobre como capturar dados veiculares com o uso de sensores e uma aplicação Delphi que foi apresentada pelos palestrantes Sileide Campos e Samuel David (o Muka) direto de seus carros. Enquanto o Muka dirigia, os dados eram apresentados em gráficos atualizados em tempo real que apareciam em outra tela monitorada pela Sileide.
Outro destaque é que pela primeira vez tivemos uma trilha acadêmica, voltada exclusivamente para estudantes, universitários, professores e iniciantes. A trilha debateu temas como o futuro do profissional de TI, dicas práticas de desenvolvimento, como construir uma carreira de sucesso, entre outros temas relevantes para este público. Os feedbacks positivos já começaram a aparecer.
Foi uma experiência totalmente nova para todos, que certamente não substitui o olho no olho, mas trouxe muitos aprendizados e possibilitou levar calor humano para todos que se conectaram a esta causa!
Fri Oct 23 2020 06:50:10 GMT+0700 (Western Indonesia Time)
During my studies at ThePowerMBA I was introduced to the concept of Angles of Analysis, which are the aspects we should consider whenever we analyze a business model.
The main goals of this analysis are:
Be able to analyze the business model methodically.
Understand hidden or subtle aspects of the business model.
Catch problems or missing details in order to plan ahead.
I decided to make a short exercise to check how these Angles are reflected in the business model of my own startup company, KashKlik (an innovative Influencer Marketing platform).
Below you see a short description of each Angle of Analysis and its respective evaluation for the KashKlik business model.
Is the market big enough?
Knowing the market size for your product or service is essential to predict your growth potential.
In the case of KashKlik we researched the market (in 2016) and reached these numbers:
The Digital Ad Spending (total advertiser budgets for digital advertising) was higher than 150 Billion Dollars (globally), and a growing part of this budget was being invested in Influencer Marketing.
The total number of micro-influencers in the different Social Networks was higher than 250 million people (globally) including an estimated 75 million at Facebook and 60 million at YouTube.
Can you reach the market in a sustainable way?
The question here is if the company has the right marketing and distribution channels in place to grow, what is also called an “Engine of Growth” (a repeatable, stable way to grow).
In the case of KashKlik, this was our planned Marketing Strategy (in 2016):
Sales efforts:
Partnerships with Digital Marketing Agencies to acquire several advertisers through a single contact point.
Direct contact with potential advertisers through our Regional Managers.
Participation at professional conferences and meetups.
Content-driven growth:
Publications of professional reviews about KashKlik on Digital Marketing media outlets.
Inbound marketing: bring traffic to KashKlik’s site through the publication of professional articles on our blog.
Creation of marketing material such as infographics and presentations.
Search Engine Optimization (SEO).
Paid promotions:
Marketing campaigns of KashKlik on Google AdWords, Facebook, Twitter and other Social Networks.
Bootstrap campaigns in which the influencers can promote KashKlik itself.
Affiliate campaigns in which influencers are paid when they bring new users to the platform.
Email marketing campaigns, acquiring lists of email addresses of potential customers.
Organic growth:
Active presence on Social Media, sharing useful material about Influencer Marketing.
Daily reach to thousands of real followers on Facebook, Twitter and other Social Networks.
Email newsletters to our users and to subscribers of our blog.
Is it important to customers?
Here the question is what is your value proposition and if you are solving a real problem.
In the case of KashKlik, our value proposition is:
For advertisers: provide a new channel to promote their campaigns.
For influencers: provide a new source of income (be paid to promote campaigns).
Are you customers happy and returning?
The idea here is to measure if our customers are satisfied and if they are coming back.
In the case of KashKlik we validated our platform by initially running several pilot campaigns and asking about the satisfaction of both our advertisers and our influencers. Later, with a higher volume of campaigns and more active influencers, we also started collecting metrics, such as the average number of campaigns being promoted per influencer.
Is it difficult for customers to leave you or switch?
The question here is if the service you provide has a lock-in effect (switching costs), in the sense that it is difficult for your customer to switch from your service to the competition.
In the case of KashKlik, when the top influencers promote campaigns, they gradually build a history of positive achievements with high performance scores. This success history will give them access to the best campaigns in the future. Thus our top users have a clear and concrete incentive to continue using the platform.
Do you have recurring revenue streams?
Here the question is if the company may benefit from repeat transactions from the same customer.
In the case of KashKlik, we clearly observed that the advertisers that were satisfied with the performance of their campaigns would promote new campaigns, generating recurring revenue.
What kind of margins do you have?
This aspect focuses on the company’s profit margins.
In the case of KashKlilk, we get a 20% commission on top of the budget for each campaign, which is mostly profit because we have low fixed costs.
Are you generating cash flow?
The question here is if the company’s cash flow is stable and predictable.
At KashKlik we adopted a policy in which the advertiser must pay for the campaign before it starts, but we only pay to the influencers after the campaign finishes. This mechanism has created a very positive and safe cash flow.
Is your business model scalable?
Scalability is the ability of a business model to grow considerably, rapidly, and with increasing margins (the revenues grow more than the expenses).
At KashKlik we have created a fully-automated Influencer Marketing platform based on advanced Machine Learning algorithms. This high level of automation assures that we are scalable, with very low fixed costs.
Do you have any barriers of entry?
A barrier to entry is anything that protects you from potential competitors.
In the case of KashKlik, our main protection against the competition are our proprietary Machine Learning algorithms, which were developed based on many years of personal experience in the field of Computational Advertising.
Have you reached product-market fit?
The goal here is to find a clear fit between the market and your value offer.
At KashKlik we were able to validate our product during the several pilots we executed with different types of advertisers. It is clear for us now that there is a real demand for our solution, both on the advertiser side and on the influencer side.
Conclusions
I really enjoyed doing this analysis. As I wrote in a previous post, when I joined ThePowerMBA, I had the goal to apply what I would learn to my own startup company. Now I feel that I’ve started doing that, so I’m already benefiting from what I’m learning.
Tue Oct 20 2020 12:25:06 GMT+0700 (Western Indonesia Time)
This week I was invited by the Jewish Agency to give an interview about Aliyah (immigration to Israel according to the Law of Return). In particular I spoke about Kiriat Yam, the city where I live. Many Brazilian Olim (new immigrants) come to Kiriat Yam because of our Mercaz Klitah (Absorption Center).
I have been working as a volunteer for more than 5 years helping new Olim, and in this interview I share my main observations about their challenges and the most effective ways to guarantee a successful Aliyah.
The interview was in Portuguese and was broadcasted as an Instagram Live Event:
Mon Oct 19 2020 22:23:26 GMT+0700 (Western Indonesia Time)
Heutzutage ist Low-Code-Entwicklung angesagt. Verschiedene Forschungsgruppen, wie Gartner, setzen Sie den Low-Code Anwendungsentwicklungsplattform Markt bei ~ $ 10M Milliarden im Jahr 2019 und Projekt CAGR werden mehr als 20% von 2020 bis 2027. Im Gegensatz dazu hat sich der Markt für Entwickler – Tools weitgehend stagnierte Das Wachstum wird bestenfalls auf unter 5% geschätzt, was hauptsächlich auf die breite Verbreitung von Open Source zurückzuführen ist.
Warum ist das für Delphi-Entwickler wichtig? Lassen Sie mich zunächst einen kurzen Überblick über Low Code geben, da viele Entwickler mit dem Konzept nicht vertraut sind. Low Code ist ein Softwareentwicklungsansatz, der wenig bis gar keine Codierung erfordert, um Anwendungen und Prozesse zu erstellen. Eine Low-Code-Entwicklungsplattform verwendet visuelle Schnittstellen mit einfacher Logik und Drag-and-Drop-Funktionen anstelle umfangreicher Codierungssprachen. Niedriger Code ist kaum neu. Vor 20 Jahren zielten 4G-Skriptsprachen darauf ab, die Entwicklung zu vereinfachen, indem einfache Sprachen wie C ++ in vereinfachte Skriptsprachen abstrahiert wurden. Einige davon wurden speziell entwickelt (z. B. SAS), andere waren allgemeiner (LANSA, UNIFACE usw.). Viele der letzteren haben sich inzwischen zu Low-Code-Plattformen entwickelt.
Some of the most popular and relatively new examples of low-code platforms these days are Outsystems and Mendix. They provide visual IDEs and produce web applications that can be deployed on mobile. They have slick UIs, for sure, but what is important is that underneath they consist of Java/C# applications with JavaScript front ends. Indeed, almost always to implement complex apps, you have to go to the source code and program in these respective languages.
Das häufige Portieren dieser Teile der App in die IDE ist nicht so einfach, oder zumindest geht der Low-Code-Aspekt verloren. Beispielsweise können Sie Mendix mit Java „erweitern“.
Dies bedeutet, dass Sie zum Erstellen einer komplexen App möglicherweise plötzlich einen Java-Entwickler, einen JavaScript-Entwickler und einen visuellen OutSystems-Entwickler benötigen. Sie können sich die Auswirkungen auf die Entwicklungsgeschwindigkeit und insbesondere auf die Wartung von Anwendungen vorstellen.
Während viele Low-Codes No-Code-Ansätze versprechen, ist dies für robuste Apps, die skalierbar und leistungsfähig sind, häufig nicht praktikabel. Es ist kein Zufall, dass alle Low-Code-Plattformen auf Armeen von Beratern und professionellen Diensten angewiesen sind.
All dies erinnert Sie sicher an RAD Studio. Das Besondere an RAD Studio ist, dass Sie nahtlos von der visuellen Entwicklung zur Codierung wechseln, um die Leistung zu maximieren. Die resultierende App ist sehr leistungsfähig und letztendlich skalierbar. Wenn Sie einen Webclient erstellen möchten, können Sie natürlich durch einige Ansätze zu JavaScript geschickt werden, aber es unterscheidet sich nicht so sehr von einer „ausgefallenen“ Low-Code-Plattform.
Der Hauptvorteil von Low Code besteht darin, dass Sie weniger Entwickler benötigen und die Benutzer das System schnell erlernen können. Nun, das ist das Geheimnis von Delphi. Sie benötigen nur wenige Entwickler, und das Erlernen von Delphi ist wahrscheinlich so einfach wie das Erlernen einer dieser Low-C-Code-Plattformen. Die echten Delphi-Experten kennen Delphi. Die echten Experten für diese anderen Plattformen müssen so viel mehr wissen. Die Delphi-Community, die möglicherweise nicht so groß ist wie die von C # oder C ++, ist im Vergleich zu einem dieser Low-Code-Ansätze riesig. Schließlich und vor allem kostet RAD Studio nur einen Bruchteil der Kosten einer anderen Low-Code-Lösung.
Wenn Sie das nächste Mal gefragt werden, warum Sie RAD Studio und Delphi lieben, sagen Sie ihnen einfach: Es ist wie mit einer Low-Code-Lösung, aber viel besser!
Mon Oct 19 2020 01:35:42 GMT+0700 (Western Indonesia Time)
En estos días, el desarrollo de código bajo está de moda. Varios grupos de investigación, como Gartner, situaron el mercado de la plataforma de desarrollo de aplicaciones de código bajo en ~ $ 10M mil millones en 2019 y proyectan que la CAGR será superior al 20% de 2020 a 2027. Por el contrario, el mercado de herramientas para desarrolladores se ha mantenido prácticamente plano , y se estima que el crecimiento será inferior al 5% en el mejor de los casos, impulsado en gran medida por la amplia proliferación del código abierto.
¿Por qué es esto importante para los desarrolladores de Delphi? Permítanme comenzar con una descripción general rápida del código bajo, ya que muchos desarrolladores no están familiarizados con el concepto. Low code es un enfoque de desarrollo de software que requiere poca o ninguna codificación para crear aplicaciones y procesos. Una plataforma de desarrollo de bajo código utiliza interfaces visuales con lógica simple y funciones de arrastrar y soltar en lugar de extensos lenguajes de codificación. El código bajo no es nada nuevo. Hace veinte años, los lenguajes de scripting 4G tenían como objetivo simplificar el desarrollo mediante la abstracción de lenguajes de bajo nivel, como C ++, en lenguajes de scripting más simplificados. Algunos de estos fueron construidos expresamente (por ejemplo, SAS) y otros eran más genéricos (LANSA, UNIFACE, etc.). Muchos de estos últimos ahora se han convertido en plataformas de código bajo.
Algunos de los ejemplos más populares y relativamente nuevos de plataformas de código bajo en estos días son Outsystems y Mendix. Proporcionan IDE visuales y producen aplicaciones web que se pueden implementar en dispositivos móviles. Tienen interfaces de usuario elegantes, sin duda, pero lo importante es que en el fondo consisten en aplicaciones Java / C # con interfaces de JavaScript. De hecho, casi siempre para implementar aplicaciones complejas, debe ir al código fuente y al programa en estos respectivos idiomas.
Con frecuencia, trasladar estas partes de la aplicación al IDE no es tan fácil, o al menos se pierde el aspecto de código bajo. Por ejemplo, puede “expandir” Mendix con Java.
Lo que esto significa es que, para crear una aplicación compleja, de repente puede necesitar un desarrollador de Java, un desarrollador de JavaScript y sí, un desarrollador visual de OutSystems. Puede imaginar el impacto en la velocidad del desarrollo y especialmente en el mantenimiento de las aplicaciones.
Si bien muchos códigos bajos prometen enfoques sin código, con frecuencia esto no es práctico para aplicaciones robustas que son escalables y de rendimiento. No es casualidad que todas las plataformas low-code dependan de ejércitos de consultores y servicios profesionales.
Ahora, todos estos le recuerdan con seguridad a RAD Studio. Lo bueno de RAD Studio es que puede pasar sin problemas del desarrollo visual a la codificación para maximizar el rendimiento. La aplicación resultante es de alto rendimiento y, en última instancia, escalable. Por supuesto, si desea crear un cliente web, algunos enfoques podrían enviarlo a JavaScript, pero no es tan diferente de una plataforma de código bajo “elegante”.
El principal beneficio del código bajo es que necesita menos desarrolladores y la gente puede aprender el sistema rápidamente. Bueno, ese es el secreto de Delphi. Necesita pocos desarrolladores, y aprender Delphi probablemente sea tan fácil como aprender cualquiera de estas plataformas de código C bajo. Los verdaderos expertos de Delphi conocen Delphi. Los verdaderos expertos de estas otras plataformas tienen que saber mucho más. La comunidad Delphi, que puede no ser tan grande como la de C # o C ++, es enorme en comparación con cualquiera de estos enfoques de código bajo. Finalmente, y lo que es más importante, RAD Studio tiene una fracción del costo de cualquier otra solución de código bajo.
Entonces, la próxima vez que alguien le pida que explique por qué ama RAD Studio y Delphi, dígale: ¡Es como tener una solución de código bajo, pero mucho mejor!
Mon Oct 19 2020 01:35:00 GMT+0700 (Western Indonesia Time)
Atualmente, o desenvolvimento de baixo código está em voga. Vários grupos de pesquisa, como o Gartner, estimam o mercado de plataforma de desenvolvimento de aplicativos de baixo código em cerca de US $ 10 milhões em 2019 e projetam que o CAGR seja superior a 20% de 2020 a 2027. Em contraste, o mercado de ferramentas de desenvolvedor permaneceu praticamente estável , e o crescimento é estimado em menos de 5%, na melhor das hipóteses, em grande parte impulsionado pela ampla proliferação de software livre.
Por que isso é importante para desenvolvedores Delphi? Deixe-me começar com uma rápida visão geral do baixo código, já que muitos desenvolvedores não estão familiarizados com o conceito. O baixo código é uma abordagem de desenvolvimento de software que requer pouca ou nenhuma codificação para construir aplicativos e processos. Uma plataforma de desenvolvimento de baixo código usa interfaces visuais com lógica simples e recursos de arrastar e soltar em vez de linguagens de codificação extensas. O código baixo dificilmente é novo. Vinte anos atrás, as linguagens de script 4G visavam simplificar o desenvolvimento abstraindo linguagens de baixo nível, como C ++, em linguagens de script mais simplificadas. Alguns deles foram construídos especificamente (por exemplo, SAS) e outros eram mais genéricos (LANSA, UNIFACE, etc.). Muitos dos últimos agora evoluíram para plataformas de baixo código.
Alguns dos exemplos mais populares e relativamente novos de plataformas de baixo código atualmente são Outsystems e Mendix. Eles fornecem IDEs visuais e produzem aplicativos da web que podem ser implantados em dispositivos móveis. Eles têm interfaces de usuário elegantes, com certeza, mas o que é importante é que, por baixo, consistem em aplicativos Java / C # com front-ends em JavaScript. Na verdade, quase sempre para implementar aplicativos complexos, você precisa ir ao código-fonte e programar nessas respectivas linguagens.
Portar frequentemente essas partes do aplicativo para o IDE não é tão fácil, ou pelo menos o aspecto de baixo código é perdido. Por exemplo, você pode “expandir” o Mendix com Java.
O que isso significa é que, para construir um aplicativo complexo, de repente você pode precisar de um desenvolvedor Java, um desenvolvedor JavaScript e, sim, um desenvolvedor visual OutSystems. Você pode imaginar o impacto na velocidade de desenvolvimento e principalmente na manutenção de aplicativos.
Embora muitos códigos baixos prometam abordagens sem código, isso frequentemente não é prático para aplicativos robustos que são escalonáveis e de alto desempenho. Não é por acaso que todas as plataformas de baixo código dependem de exércitos de consultores e serviços profissionais.
Agora, tudo isso o lembra com certeza do RAD Studio. O que é ótimo no RAD Studio é que você muda perfeitamente do desenvolvimento visual para a codificação para maximizar o desempenho. O aplicativo resultante é de alto desempenho e, em última análise, escalonável. Claro, se você deseja construir um cliente da web, algumas abordagens podem levá-lo ao JavaScript, mas não é tão diferente de uma plataforma de baixo código “sofisticada”.
O principal benefício do baixo código é que você precisa de menos desenvolvedores e as pessoas podem aprender o sistema rapidamente. Bem, esse é o segredo da Delphi. Você precisa de poucos desenvolvedores, e aprender Delphi é provavelmente tão fácil quanto aprender qualquer uma dessas plataformas de baixo código de c. Os verdadeiros especialistas da Delphi conhecem a Delphi. Os verdadeiros especialistas dessas outras plataformas precisam saber muito mais. A comunidade Delphi, que pode não ser tão grande quanto a do C # ou C ++, é vasta se comparada a qualquer uma dessas abordagens de baixo código. Por fim e mais importante, o RAD Studio custa uma fração do custo de qualquer outra solução de baixo código.
Portanto, da próxima vez que alguém lhe pedir para explicar por que você adora o RAD Studio e o Delphi, apenas diga: é como ter uma solução de baixo código, mas muito melhor!
Mon Oct 19 2020 01:34:35 GMT+0700 (Western Indonesia Time)
В наши дни в моде разработка low-code. Различные исследовательские группы, такие как Gartner, оценивают рынок платформ для разработки приложений с низким кодом в ~ 10 миллионов долларов в 2019 году и прогнозируют, что CAGR превысит 20% в период с 2020 по 2027 год. Напротив, рынок инструментов для разработчиков в основном остается неизменным. , а рост, по оценкам, в лучшем случае составляет менее 5%, в основном за счет широкого распространения открытого кода.
Почему это важно для разработчиков Delphi? Позвольте мне сначала начать с краткого обзора low-кода, поскольку многие разработчики не знакомы с этой концепцией. Низкий код — это подход к разработке программного обеспечения, который практически не требует программирования для создания приложений и процессов. Платформа разработки с низким кодом использует визуальные интерфейсы с простой логикой и функциями перетаскивания вместо обширных языков программирования. Низкий код вряд ли что-то новое. Двадцать лет назад языки сценариев 4G были нацелены на упрощение разработки за счет абстрагирования низкоуровневых языков, таких как C ++, в более упрощенные языки сценариев. Некоторые из них были специально созданы (например, SAS), а другие носили более общий характер (LANSA, UNIFACE и т. Д.). Многие из последних теперь превратились в платформы с низким кодом.
Некоторые из самых популярных и относительно новых примеров платформ с низким кодом в наши дни — это Outsystems и Mendix. Они предоставляют визуальные IDE и создают веб-приложения, которые можно развертывать на мобильных устройствах. У них, конечно, красивые пользовательские интерфейсы, но важно то, что они состоят из приложений Java / C # с интерфейсом JavaScript. Действительно, почти всегда, чтобы реализовать сложные приложения, вам нужно обратиться к исходному коду и программе на этих языках.
Часто портировать эти части приложения в среду IDE не так просто, по крайней мере теряется аспект низкого кода. Например, вы можете «расширить» Mendix с помощью Java.
Это означает, что для создания сложного приложения вам внезапно могут понадобиться Java-разработчик, JavaScript-разработчик и да, визуальный разработчик OutSystems. Вы можете себе представить, как это повлияет на скорость разработки и особенно обслуживания приложений.
Хотя многие низкие коды обещают подходы без кода, это часто непрактично для надежных приложений, которые являются масштабируемыми и производительными. Не случайно все low-code платформы полагаются на армии консультантов и профессиональные услуги.
Теперь все это наверняка напоминает о RAD Studio. Что замечательно в RAD Studio, так это то, что вы легко переходите от Visual Development к программированию, чтобы добиться максимальной производительности. Полученное приложение является высокопроизводительным и масштабируемым. Конечно, если вы хотите создать веб-клиент, некоторые подходы могут направить вас на JavaScript, но он не так уж отличается от «причудливой» платформы с низким кодом.
Основное преимущество низкого кода заключается в том, что вам нужно меньше разработчиков, и люди могут быстро изучить систему. Что ж, в этом секрет Delphi. Вам нужно немного разработчиков, а изучить Delphi, вероятно, так же просто, как изучить любую из этих платформ с низким кодом c. Настоящие эксперты Delphi знают Delphi. Настоящие эксперты по этим другим платформам должны знать гораздо больше. Сообщество Delphi, которое может быть не таким большим, как сообщество C # или C ++, обширно по сравнению с любым из этих подходов с низким кодом. Наконец, что важно, стоимость RAD Studio составляет лишь часть стоимости любого другого решения с низким уровнем кода.
Поэтому в следующий раз, когда кто-то попросит вас объяснить, почему вы любите RAD Studio и Delphi, просто скажите им: это похоже на решение с низким кодом, но намного лучше!
Sun Oct 18 2020 07:24:56 GMT+0700 (Western Indonesia Time)
A book for managers, about architecture
Ruth Malan re-stated Conway’s law like this: “If the architecture of the system and the architecture of the organization are at odds, the architecture of the organization wins”. As a technical leader, that really caught my attention. The sphere of things I should be able to influence in order to do my job well just grew!
I read that quote in the book “Team Topologies” by Matthew Skelton and Manuel Pais. I think it’s a really interesting book and introduces several ideas that were new to me at least. They deserve a wide audience within the software industry. In this article I’ll give you some highlights, and hopefully tempt you to read the book for yourself.
This first idea perhaps isn’t so novel, but it is the basis for the rest, so worth mentioning first. You should use the team as the fundamental building block for your organization. Rather than thinking about hierarchies or departments that get re-organized from time to time, think about building close-knit, long-lived teams. Adopt a team structure that is aligned to the business and adapts and evolves over time.
Conway’s law
When designing a team structure for your organization you should take into account Conway’s law. Your team structure and your software architecture are strongly linked. You should design team responsibilities and communication pathways. Skelton and Pais suggest there are four fundamental team topologies, ie kinds of team. The main one is ‘business stream-aligned’, the other three have supporting roles. The way they describe a stream-aligned team seems familiar to me. It’s like a DevOps team or a feature team. I think the name is better though. It’s a team that’s aligned to a single, valuable stream of work. They do everything needed to deliver valuable software to customers, gather feedback from how it’s used, and improve the way they work.
The other three kinds of team exist to reduce the burden on those stream-aligned teams. Skelton and Pais introduce the idea that good organization design requires restricting the amount of ‘cognitive load’ each team is expected to handle. Software systems can become large and complex and can require an overwhelming amount of detailed knowledge to work on them. This really resonated with me. I’ve worked on teams where the amount of software we had to look after was just too much to cope with. Important work was delayed or missed because we were overburdened.
The other three types of team are:
Platform
Complicated Subsystem
Enabling
There is a fuller description of each in the book of course, but to summarize – platform teams provide a self-service tool, API or software service. Enabling teams support other teams with specialized knowledge in particular techniques and business domains. Complicated subsystem teams look after a particular component of the software that needs specialized knowledge, like an optimizer or a machine learning algorithm.
Following from the idea of Conway’s law in particular, is the idea that you should have only three ‘interaction modes’ between teams. Restrict the communication pathways to get the architecture you want, and to avoid unnecessary team cognitive load. Skelton and Pais suggest teams should work together in one of three ways:
Collaborate
Facilitate
Provide X-as-a-Service
Collaboration means two teams work closely together, have a common goal, and only need to work this closely for a limited time. (Otherwise the teams would merge!) Facilitation is about one team clearing impediments that are holding back the other team. X-as-a-service is a much looser collaboration, where one team provides something like a software library or api to another team. The way teams interact with one another will evolve over time, and consequently your organization will also evolve.
I thought it was a good sign that I could imagine how my own work would fit into an organization designed this way. I think I would fit well into an Enabling team that would support stream-aligned teams through facilitation. We would work with several teams over time. My particular role is to facilitate a team to clear impediments around technical debt and code quality, and learn skills like Test-Driven Development.
Team Topologies really does make organizational design feel like you’re doing architecture. Skelton and Pais have pretty diagrams throughout their book with colours and patterns and lines and boxes describing various organizational designs. It’s all very attractive to a software developer like me. I think the intended audience is managers though. People who are designing organizations today. I really hope some of them read this book and are inspired to involve technical people in important organizational decisions.
Fri Oct 16 2020 22:23:50 GMT+0700 (Western Indonesia Time)
Während Teil 1 unseres Webinars letzte Woche gab es einige Fragen zur Installation von Komponenten und zu den ersten Schritten. Ich habe ein kurzes Video gemacht und wollte hier einige Details liefern.
SynEdit is an optional library that provides syntax highlighting and proper indention behaviors if you want to allow users to edit Python code in your application. If you just want to interact with Python and Python libraries then you don’t need SynEdit. It is an open-source VCL only component set available via GetIt or on GitHub. Installing it via GetIt is the easiest.
Python4Delphiist die Bibliothek, die die Integration zwischen Python und Delphi ermöglicht. Es ist effektiv eine bidirektionale Brücke, die es Delphi ermöglicht, Python-Code auszuführen und Python-Bibliotheken aufzurufen, und Python ermöglicht es, in Delphi geschriebene Module aufzurufen, um auf andere Weise mit Delphi-Code, Objekten, Schnittstellen, Datensätzen usw. zu interagieren. Sie können beispielsweise die VCL umbrechen Python und verwenden Sie es, um eine Anwendungs-GUI zu erstellen. Dies ist eineWiki-Seite zur Installation.
Python bietet Bibliotheken und Interpreter. Sie benötigen die richtige Version für die Plattform, auf die Sie abzielen (Win, macOS, Linux usw.), und stellen sicher, dass die Bitness (32 vs 64-Bit) mit Ihrem Programm übereinstimmt. Sie können unter Windows sowohl 32- als auch 64-Bit-Versionen nebeneinander installieren. Python bietet eineeinbettbare Version, die nur eine minimale Installation darstellt und die Sie problemlos in Ihr Programm aufnehmen können. Weitere Informationen zur Verwendung bestimmter Python-Versionen finden Sie im P4D-Wiki .
Fri Oct 16 2020 06:46:46 GMT+0700 (Western Indonesia Time)
A brand new lesson dedicated solely for reviewing has finally been added to all levels of our Essential Korean Courses!
The main ideas of all 30 lessons are squeezed into one compact lesson to make your run-of-the-mill review sessions more efficient and enjoyable.
One third of it is available to our Basic members, while the Premium users can benefit from it entirely.
Test yourself quick and easy under the Dialogue tab! Listen to the audio conversation that covers everything you’ve learned in your particular level, and reinforce your understanding with the provided Korean script and its English translation. Study wherever, and whenever, using the complimentary MP3 and PDF files.
Available for both Basic & Premium Users.
Listen to the sample audio track below!
Save time by reviewing the key vocabulary words in one go! Check your memory first by reading the vocabulary list, and then listen to the provided audio track – led by Hyunwoo & Kyeong-eun – to mark your answers. You’ll also be given the lists in both Korean and English.
Available for Premium Users only.
Listen to the sample audio track below!
Review major grammar points by clicking on the Grammar tab! Hyunwoo & Kyeong-eun will go over the condensed summary of each level in the given audio tracks, where you’ll have to answer questions to test your understanding.
Fri Oct 16 2020 01:36:37 GMT+0700 (Western Indonesia Time)
Во время части 1 нашего вебинара на прошлой неделе было несколько вопросов об установке компонентов и начале работы. Я сделал короткое видео и хотел рассказать здесь некоторые подробности.
SynEdit — это дополнительная библиотека, которая обеспечивает выделение синтаксиса и правильное поведение отступов, если вы хотите разрешить пользователям редактировать код Python в вашем приложении. Если вы просто хотите взаимодействовать с библиотеками Python и Python, вам не нужен SynEdit. Это набор компонентов VCL с открытым исходным кодом, доступный через GetIt или на GitHub. Проще всего установить через GetIt.
Python4Delphi— это библиотека, которая обеспечивает интеграцию между Python и Delphi. По сути, это двунаправленный мост, который позволяет Delphi выполнять код Python и вызывать библиотеки Python, а также позволяет Python вызывать модули, написанные на Delphi, иным образом взаимодействовать с кодом Delphi, объектами, интерфейсами, записями и т. Д. Например, вы можете обернуть VCL из Python и используйте его для создания графического интерфейса приложения. Это вики-страница, посвященная установке.
Pythonпредоставляет библиотеки и интерпретаторы. Вам понадобится версия, подходящая для целевой платформы (Win, macOS, Linux и т. Д.), И убедитесь, что разрядность (32-разрядная или 64-разрядная) соответствует вашей программе. В Windows можно установить одновременно 32-разрядную и 64-разрядную версии. Python предоставляет встраиваемую версию, которая требует минимальной установки, и вы можете легко включить ее в свою программу. Для получения дополнительной информации об использовании определенных версий Python см. P4D Wiki.
Fri Oct 16 2020 01:33:31 GMT+0700 (Western Indonesia Time)
Durante la parte 1 de nuestro seminario web la semana pasada, hubo algunas preguntas sobre cómo instalar componentes y comenzar. Hice un video corto y quería brindar algunos detalles aquí.
SynEdit es una biblioteca opcional que proporciona resaltado de sintaxis y comportamientos de sangría adecuados si desea permitir que los usuarios editen el código Python en su aplicación. Si solo desea interactuar con las bibliotecas de Python y Python, entonces no necesita SynEdit. Es un conjunto de componentes de VCL de código abierto disponible a través de GetIt o en GitHub. Instalarlo a través de GetIt es lo más fácil.
Python4Delphies la biblioteca que proporciona la integración entre Python y Delphi. Es efectivamente un puente bidireccional que permite a Delphi ejecutar código Python y llamar a bibliotecas de Python y permite que Python llame a módulos escritos en Delphi para interactuar de otra manera con código Delphi, objetos, interfaces, registros, etc. Por ejemplo, podría envolver el VCL desde Python y utilícelo para crear una aplicación GUI. Es una página wiki que cubre la instalación.
Pythonproporciona bibliotecas e intérpretes. Necesitará la versión correcta para la plataforma a la que se dirige (Win, macOS, Linux, etc.) y asegúrese de que el bitness (32 frente a 64 bits) coincida con su programa. Puede instalar versiones de 32 y 64 bits una al lado de la otra en Windows. Python proporciona una versión integrable que es una instalación mínima y puede incluirla fácilmente con su programa. Para obtener más información sobre el uso de versiones específicas de Python, consulte P4D Wiki.
Fri Oct 16 2020 01:32:26 GMT+0700 (Western Indonesia Time)
Durante a parte 1 do nosso webinar na semana passada, houve algumas perguntas sobre a instalação de componentes e primeiros passos. Fiz um pequeno vídeo e queria dar alguns detalhes aqui.
SynEdit é uma biblioteca opcional que fornece realce de sintaxe e comportamentos de recuo adequados se você deseja permitir que os usuários editem o código Python em seu aplicativo. Se você deseja apenas interagir com as bibliotecas Python e Python, não precisa do SynEdit. É um conjunto de componentes VCL de código aberto disponível via GetIt ou no GitHub. Instalá-lo via GetIt é o mais fácil.
Python4Delphié a biblioteca que fornece a integração entre Python e Delphi. É efetivamente uma ponte bidirecional que permite ao Delphi executar código Python e chamar bibliotecas Python e permite ao Python chamar módulos escritos em Delphi de outra forma interagir com código Delphi, objetos, interfaces, registros, etc. Por exemplo, você pode envolver o VCL de Python e use-o para criar um aplicativo GUI. A é uma página wiki que cobre a instalação.
Pythonfornece bibliotecas e interpretadores. Você precisará da versão certa para a plataforma de destino (Win, macOS, Linux, etc.) e certifique-se de que a quantidade de bits (32 x 64 bits) corresponda ao seu programa. Você pode instalar as versões de 32 e 64 bits lado a lado no Windows. Python fornece uma versão embutida que é uma instalação mínima e você pode facilmente incluí-la em seu programa. Para obter mais informações sobre o uso de versões específicas do Python, consulte o Wiki do P4D.
Wed Oct 14 2020 22:35:02 GMT+0700 (Western Indonesia Time)
Met elke versie van InterBase introduceren we nieuwe functies die de database-ervaring gemakkelijker maken voor onze gebruikers. Toen InterBase 2020 werd uitgebracht, hebben we verschillende verbeteringen toegevoegd en een geweldige nieuwe functie genaamd Tablespaces.
Mit jeder Version von InterBase führen wir neue Funktionen ein, die unseren Benutzern das Datenbankerlebnis erleichtern. Als InterBase 2020 veröffentlicht wurde, haben wir einige Verbesserungen und eine großartige neue Funktion namens Tablespaces hinzugefügt.
Was ist ein InterBase-Tablespace?
Ein Tablespace ist eine Art Speicherort, der für Datenbankobjekte bestimmt ist. Sie können Datendateien in einem bestimmten Speicherplatz (Speicherort) zusammenfassen, den Sie auswählen. Tablespaces ermöglichen eine bessere Leistung der Datenbank und die Optimierung der Serverhardware, indem Entwickler und Administratoren mehr Kontrolle über das Festplattenlayout haben.
Ein paar Dinge, die Sie über Tablespaces wissen sollten
Die Seitengröße Ihrer Datenbank entspricht der Seitengröße Ihres Tablespace.
Die maximale Größe von IB-Datenbanken kann mithilfe von primären und 254 sekundären Tabellenbereichen von 32 TB auf 8160 TB erhöht werden
Sie können Tablespaces verwenden, um die Leistung Ihrer Laufzeitdatenbank zu optimieren.
Ihre Hauptdatenbankdatei (en) ist / sind immer der primäre Tabellenbereich
Einrichten Ihrer Tablespaces
IBConsole
Erstellen Sie Ihren Tablespace – geben Sie ihm einen Namen und einen Dateispeicherort
Tabellen dem Tabellenbereich zuweisen – Öffnen Sie die Tabelle oder den Index und ändern Sie den Speicherort des Tabellenbereichs
Überprüfen Sie, ob die Tabellen und Indizes in Ihren Tablespace-Eigenschaften aufgeführt sind
Schauen Sie sich das Video zum Einrichten eines Tablespace für eine Tabelle und einen Index in IBConsole an
Hinweis: Sie können dem Tablespace die Dateierweiterung Ihrer Wahl geben oder gar keine verwenden.
2. Weisen Sie Ihrem Tablespace Tabellen und Indizes zu:
ALTER TABLE <Tabellenname> [ALTER TABLESPACE {<Tabellenbereichsname>}]
ALTER INDEX <Indexname> <Spaltenliste> [ALTER TABLESPACE {<Tabellenbereichsname>}]
3. Doppelklicken Sie auf den in IBConsole erstellten Tabellenbereich und stellen Sie sicher, dass die von Ihnen hinzugefügten Tabellen und Indizes vorhanden sind oder ISQL verwenden:
TABELLEN IN TABELLENPLATZ ANZEIGEN [<Tabellenbereichsname>]
INDIZES IN TABLESPACE ANZEIGEN [<Tabellenbereichsname>]
Möchten Sie mehr über Tablespaces in InterBase 2020 erfahren?
Wed Oct 14 2020 22:24:16 GMT+0700 (Western Indonesia Time)
Kürzlich haben wir ein neues Experiment gestartet, um einige interne Projekte für MVPs zu öffnen, an denen sie arbeiten können. Im Gegensatz zu einigen unserer Open-Source-Initiativen wie Bold gehören diese weiterhin Embarcadero und sind ein Hauptbestandteil des Produkts. Dies ist etwas, worum MVPs gebeten haben, sich für eine Weile zu beteiligen. Es ist also sehr aufregend, endlich zu sagen, dass es in vollem Gange und ein Erfolg ist.
Das erste experimentelle Projekt war der XML-Mapper , und seit einigen Tagen ist die erste Version des aktualisierten XML-Mappers über GetIt verfügbar . Die Hauptziele dieser ersten Version waren das Aktualisieren der Benutzeroberfläche, das Beheben vorhandener Fehler und das Verbessern der Einhaltung von XML-Schemastandards. Das Team hat jedoch einige große Pläne für die Zukunft von XML Mapper, sodass Sie viele weitere Updates sehen werden.
Wenn Sie sich den alten XML-Mapper ansehen, bevor Sie den neuen installieren, werden Sie sehen, wie weit er gekommen ist.
Original vs. aktualisierte Benutzeroberfläche
Genau wie RAD Studio unterstützt der XML-Mapper sowohl das helle als auch das dunkle Thema und synchronisiert die Themenänderungen automatisch mit RAD Studio (und letztendlich sogar dem Betriebssystem).
Helle vs. dunkle Benutzeroberfläche
Wenn Sie nach der Installation des neuen XML-Mappers aus nostalgischen Gründen auf den alten XML-Mapper zugreifen möchten oder ihn deinstallieren müssen, wird der alte XML-Mapper gesichert, damit er wiederhergestellt werden kann. Sie finden es in dem C:UsersJimDocumentsEmbarcaderoStudio21.0CatalogRepositoryXMLMapper-27Ordner, der in umbenannt wurde XmlMapper_old.exe.
Zuletzt möchte ich allen MVPs, die am Testen und Aktualisieren des XML Mapper-Projekts beteiligt waren, einen Gruß aussprechen, insbesondere dem Kernteam, das an diesem Projekt festgehalten und es bis zur erfolgreichen Veröffentlichung durchgearbeitet hat und arbeitet hart auf zukünftige Funktionen und Updates.
Geben Sie [ALT] + TEAM auf dem Info-Bildschirm ein
Ich bat jedes der Mitglieder des Kernteams, einige Gedanken über ihre Beteiligung zu teilen.
Roger Swann
Ich war vorsichtig, mich dem XML MVP-Projekt anzuschließen: Als C ++ – Typ zu arbeiten und an diesem Delphi-basierten System zu arbeiten, machte mich vorsichtig. Es hat sich herausgestellt, dass ich der Meinung bin, dass meine Rolle bei der Codeüberprüfung einen kleinen, aber nützlichen Beitrag geleistet hat, und es ist sehr interessant, mit einer Gruppe von erfahrenen Programmierern mit unterschiedlichem Hintergrund (sowohl professionell als auch geografisch) zusammenzuarbeiten, die alle „Teamplayer“ sind. .
Roger Swann , Embarcadero C ++ MVP
Glenn Dufke
u unterstützen. Als Embarcadero ankündigte, dass MVPs zu bestimmten Projekten beitragen könnten, die Teil der IDE-Installation sind, trat ich sofort bei, um mit XML Mapper zu helfen und es noch besser zu machen. Die Erfahrung in der Zusammenarbeit hat auch ein großartiges Team talentierter Entwickler hervorgebracht, in dem wir weltweit auf Erfahrungen zurückgreifen können, und hat dazu geführt, dass XML Mapper dank des Teams enorme Fortschritte gemacht hat. Ich werde definitiv in Zukunft an weiteren Projekten teilnehmen, sobald sie verfügbar sind.
Glenn Dufke , Embarcadero MVP
Olaf Monien
Als Embarcadero ankündigte, bestimmte Projekte für die MVP-Zusammenarbeit zu öffnen, wusste ich sofort, dass dies eine großartige Gelegenheit sein würde, Code aktiv zu reparieren und zu entwickeln und Teil eines breiten Teams zu werden. Der XML-Mapper wird auch in Bezug auf seine Funktionen irgendwie unterschätzt, sodass er verlockend war, seinen Ruf zu verbessern. Während meiner Arbeit mit dem Projekt, bei dem ich als Teamleiter belohnt wurde, hatte ich die Gelegenheit, einige andere sehr talentierte MVPs zu treffen, mit denen ich zuvor kaum Kontakt hatte. Wir alle haben als Team einige wertvolle Techniken gelernt, was eine großartige Erfahrung war (und immer noch ist)!
Olaf Monien , MVP-Regionalkoordinator und XML Mapper-Teamleiter
Jason Chapman
Ich wollte nur helfen und Teil des ersten Projekts Embarcadero sein, das eng mit einer Gruppe von MVPs an einem Closed-Source-Teil der IDE zusammenarbeitet. Ich kann sehen, dass es eine erstaunliche Fahrtrichtung ist, dh die helle und enthusiastische Community dazu zu bringen, zum eigentlichen Produkt beizutragen, was ein großer Schritt nach dem Testen und Berichten von Problemen ist. Ich nahm an den meisten wöchentlichen Stand-up-Meetings teil, sah mir Code an und fand einen obskuren Fehler beim Wechseln von Monitoren mit unterschiedlichen DPIs. Der Ehrgeiz des Teams in Bezug auf den XML-Mapper ist großartig und ich hoffe, wir können weiter daran und an anderen Add-Ons / Teilen des Produkts arbeiten. Ich denke, wir haben damit begonnen, eine Vorlage für zukünftige Kooperationen zu erstellen, während wir über eine vollständige Liste von Aufgaben verfügen, an denen wir weiterarbeiten können.
Jason Chapman , regionaler Koordinator von Embarcadero MVP
Miguel Angel Moreno
Vor einigen Jahren habe ich XML Mapper als Schlüsselwerkzeug in einigen XML-basierten Projekten verwendet. Die Technologie sah beeindruckend aus, aber ich hatte das Gefühl, dass ich nicht die gesamte Leistung dieser Tools genutzt habe. Nachdem der XML-Mapper-Code MVPs zur Verfügung gestellt wurde, freue ich mich sehr, seine vollen Funktionen und Merkmale zu entdecken Helfen Sie den Entwicklern von Delphi und C ++ Builder, die Leistungsfähigkeit dieses Tools zu verstehen und zu erkunden. In der heutigen Zeit, in der die elektronische Rechnungsstellung und Buchhaltung langsam, aber stetig die Welt erobert, gab es keinen besseren Zeitpunkt, um die Funktionen zu nutzen dass XML Mapper eingebaut hat …
Miguel Angel Moreno , Embarcadero MVP
Ricardo Boaro
Die Möglichkeit, am XML Mapper-Projekt zu arbeiten, ist eine große Ehre. Ich denke, es ist ein großer Anreiz für einen MVP, Teil eines solchen Projekts zu sein. Wir teilen Ideen, lernen voneinander und wer gewinnt, ist die Entwicklergemeinde mit einem Produkt mit Verbesserungen und neuen Funktionen. Vielen Dank an alle im Team für die Partnerschaft. Heute kann ich sagen, dass ich neue Freunde habe. Vielen Dank an Embarcadero für diese Erfahrung.
Ricardo Boaro , Embarcadero MVP
Aktualisieren Sie also Ihren XML Mapper und halten Sie Ausschau nach weiteren XML Mapper-Updates und anderen MVP Project-Versionen!
Wed Oct 14 2020 21:49:02 GMT+0700 (Western Indonesia Time)
В каждой версии InterBase мы вводим новые функции, которые упрощают работу с базой данных для наших пользователей. Когда был выпущен InterBase 2020, мы добавили несколько улучшений и новую замечательную функцию под названием Tablespaces.
Что такое табличное пространство InterBase?
Табличное пространство — это тип места хранения, предназначенный для объектов базы данных. Это позволяет вам группировать файлы данных в определенном месте хранения (месте), которое вы выбираете. Табличные пространства позволяют повысить производительность базы данных и оптимизировать оборудование сервера, позволяя разработчикам и администраторам иметь больший контроль над компоновкой диска.
Несколько вещей, которые вы должны знать о табличных пространствах
Размер страницы вашей базы данных такой же, как и размер вашей табличной области.
Максимальный размер баз данных IB может увеличиться с 32 ТБ до 8160 ТБ с использованием первичных и 254 вторичных табличных пространств.
Вы можете использовать табличные пространства для оптимизации производительности вашей базы данных во время выполнения.
Ваш основной файл (ы) базы данных всегда является основным табличным пространством
Настройка ваших табличных пространств
IBConsole
Создайте свое табличное пространство — дайте ему имя и расположение файла
Назначьте таблицы табличному пространству — откройте таблицу или индекс и измените расположение табличного пространства.
Убедитесь, что таблицы и индексы перечислены в свойствах вашего табличного пространства.
Посмотрите видео о настройке табличного пространства для таблицы и индекса в IBConsole.
Командная строка и ISQL
1. CREATE TABLESPACE <имя табличного пространства> FILE <‘Path / To / File / Location’>
Примечание: вы можете дать табличному пространству расширение файла по вашему выбору или вообще не использовать его.
2. Назначьте таблицы и индексы вашему табличному пространству:
ALTER TABLE <имя_таблицы> [ALTER TABLESPACE {<имя_таблицы>}]
ALTER INDEX <имя_индекса> <список столбцов> [ALTER TABLESPACE {<имя_таблицы>}]
3. Дважды щелкните табличное пространство, созданное вами в IBConsole, и убедитесь, что добавленные вами таблицы и индексы присутствуют или используют ISQL:
ПОКАЗАТЬ ТАБЛИЦЫ В TABLESPACE [<tablespace_name>]
ПОКАЗАТЬ ИНДЕКСЫ В ТАБЛИЦЕ [<tablespace_name>]
Хотите узнать больше о табличных пространствах в InterBase 2020?
Wed Oct 14 2020 21:48:16 GMT+0700 (Western Indonesia Time)
A cada versão do InterBase, introduzimos novos recursos que tornam a experiência do banco de dados mais fácil para nossos usuários. Quando o InterBase 2020 foi lançado, adicionamos várias melhorias e um ótimo novo recurso chamado Tablespaces.
O que é um Tablespace InterBase?
Um Tablespace é um tipo de local de armazenamento destinado a objetos de banco de dados. Ele permite que você agrupe arquivos de dados em um espaço de armazenamento específico (local) de sua escolha. Os espaços de tabela permitem melhor desempenho do banco de dados e otimização do hardware do servidor, permitindo que desenvolvedores e administradores tenham mais controle sobre o layout do disco.
Algumas coisas que você deve saber sobre Tablespaces
O tamanho da página do seu banco de dados é o mesmo tamanho da página do seu espaço de tabela.
O tamanho máximo dos bancos de dados IB pode aumentar de 32 TB para 8160 TB usando espaços de tabela primários e 254 secundários
Você pode usar espaços de tabela para otimizar o desempenho do banco de dados em tempo de execução.
Seu (s) arquivo (s) de banco de dados principal (s) é / são sempre o espaço de tabela principal
Configurando seus Tablespaces
IBConsole
Crie seu espaço de tabela – dê a ele um nome e localização de arquivo
Atribuir tabelas ao espaço de tabela – Abra a tabela ou índice e altere a localização do espaço de tabela
Verifique se as tabelas e índices estão listados nas propriedades do espaço de tabela
Confira o vídeo sobre como configurar um espaço de tabela em uma tabela e índice no IBConsole
Linha de Comando e ISQL
1. CREATE TABLESPACE <nome do espaço de tabela> FILE <‘Caminho / Para / Arquivo / Localização’>
Observação: você pode atribuir ao espaço de tabela a extensão de arquivo de sua escolha ou não usar nenhuma.
2. Atribua tabelas e índices ao seu espaço de tabela:
ALTER TABLE <table_name> [ALTER TABLESPACE {<tablespace_name>}]
ALTER INDEX <index_name> <lista de colunas> [ALTER TABLESPACE {<tablespace_name>}]
3. Clique duas vezes no espaço de tabela que você criou no IBConsole e certifique-se de que as tabelas e índices adicionados estão lá ou usando ISQL:
MOSTRAR TABELAS EM TABLESPACE [<tablespace_name>]
MOSTRAR ÍNDICES NA TABLESPACE [<tablespace_name>]
Quer saber mais sobre os tablespaces no InterBase 2020?
Wed Oct 14 2020 21:47:38 GMT+0700 (Western Indonesia Time)
Con cada versión de InterBase, presentamos nuevas funciones que facilitan la experiencia de la base de datos para nuestros usuarios. Cuando se lanzó InterBase 2020, agregamos varias mejoras y una gran característica nueva llamada Tablespaces.
¿Qué es un espacio de tabla InterBase?
Un Tablespace es un tipo de ubicación de almacenamiento destinada a objetos de base de datos. Le permite agrupar archivos de datos en un espacio de almacenamiento específico (ubicación) que elija. Los espacios de tabla permiten un mejor rendimiento de la base de datos y la optimización del hardware del servidor al permitir que los desarrolladores y administradores tengan más control sobre el diseño del disco.
Algunas cosas que debe saber sobre los espacios de tabla
El tamaño de página de su base de datos es el mismo tamaño de página que su espacio de tabla.
El tamaño máximo de las bases de datos IB puede aumentar de 32 TB a 8160 TB utilizando espacios de tabla primarios y 254 secundarios.
Puede utilizar espacios de tabla para optimizar el rendimiento de su base de datos en tiempo de ejecución.
Los archivos de su base de datos principal son siempre el espacio de tabla principal
Configurar sus espacios de tabla
IBConsole
Cree su espacio de tabla: asígnele un nombre y una ubicación de archivo
Asignar tablas al espacio de tabla: abra la tabla o el índice y cambie la ubicación del espacio de tabla
Verifique que las tablas y los índices estén enumerados en las propiedades de su espacio de tabla
Vea el video sobre cómo configurar un espacio de tabla en una tabla e índice en IBConsole
Línea de comandos e ISQL
1. CREATE TABLESPACE <nombre del espacio de tabla> ARCHIVO <‘Ruta / A / Archivo / Ubicación’>
Nota: puede darle al espacio de tabla la extensión de archivo que elija o no usar ninguna.
2. Asigne tablas e índices a su espacio de tabla:
ALTER TABLE <nombre_tabla> [ALTER TABLESPACE {<nombre_espacio_tabla>}]
ALTER INDEX <index_name> <lista de columnas> [ALTER TABLESPACE {<tablespace_name>}]
3. Haga doble clic en el espacio de tabla que creó en IBConsole y asegúrese de que las tablas y los índices que agregó estén allí o utilicen ISQL:
MOSTRAR TABLAS EN TABLESPACE [<nombre_espacio_tabla>]
MOSTRAR ÍNDICES EN TABLESPACE [<nombre de espacio de tabla>]
¿Quiere obtener más información sobre los espacios de tabla en InterBase 2020?
Wed Oct 14 2020 19:49:24 GMT+0700 (Western Indonesia Time)
Recientemente, lanzamos un nuevo experimento de abrir algunos proyectos internos para que los MVP trabajen. A diferencia de algunas de nuestras iniciativas de código abierto como Bold, estas todavía son propiedad de Embarcadero y son una parte principal del producto. Esto es algo en lo que los MVP han solicitado la opción de participar durante un tiempo, por lo que es muy emocionante decir finalmente que está en pleno apogeo y es un éxito.
El primer proyecto experimental fue XML Mapper y, desde hace unos días, la primera versión del XML Mapper actualizado está disponible a través de GetIt. Los principales objetivos de esta primera versión incluían actualizar la interfaz de usuario, corregir errores existentes y mejorar el cumplimiento de los estándares del esquema XML, pero el equipo tiene grandes planes para el futuro de XML Mapper, por lo que verá muchas más actualizaciones.
Si echa un vistazo al antiguo XML Mapper antes de instalar el nuevo, verá lo lejos que ha llegado.
Interfaz de usuario original frente a actualizada
Al igual que RAD Studio, XML Mapper admite tanto el tema claro como el oscuro, y sincroniza los cambios de tema con RAD Studio (y, en última instancia, incluso con el sistema operativo) automáticamente.
Interfaz de usuario clara contra oscura
Si después de instalar el nuevo XML Mapper desea acceder al antiguo XML Mapper por razones nostálgicas, o necesita desinstalarlo, se hace una copia de seguridad del antiguo XML Mapper y está disponible para restaurarlo. Puede encontrarlo en la carpeta C:\Users\Jim\Documents\Embarcadero\Studio\21.0\CatalogRepository\XMLMapper-27 renombrada como XmlMapper_old.exe.
Por último, quiero agradecer a todos los MVP que participaron en la prueba y actualización del proyecto XML Mapper, especialmente al equipo central que se ha mantenido fiel a este proyecto y lo ha llevado a cabo con éxito, y que están trabajando duro con las funciones y actualizaciones futuras.
Escriba [ALT] + EQUIPO en la pantalla de información.
Le pedí a cada uno de los miembros del equipo central que compartieran algunas ideas sobre su participación.
Roger Swann
Desconfiaba de unirme al proyecto XML MVP: ser un chico de C ++ y trabajar en este sistema basado en Delphi me hizo cauteloso. Resultó que siento que mi función de revisión de código ha hecho una contribución pequeña pero útil y es muy interesante trabajar con un grupo de programadores hábiles e informados de diferentes orígenes (tanto profesionales como geográficos), todos los cuales son “jugadores de equipo”. .
Roger Swann, MVP de Embarcadero C ++
Glenn Dufke
XML Mapper es una herramienta increíblemente valiosa y útil para los desarrolladores, necesitaba varias actualizaciones para corregir errores y admitir funciones de esquema XML más nuevas. Cuando Embarcadero anunció que los MVP podrían contribuir a proyectos específicos que son parte de la instalación del IDE, me uní instantáneamente para ayudar con XML Mapper y hacerlo aún mejor. La experiencia de colaboración también ha fomentado un gran equipo de desarrolladores talentosos donde podemos aprovechar las experiencias de los demás a escala global y ha dado como resultado que XML Mapper avanza enormemente, todo gracias al equipo. Definitivamente me uniré a más proyectos en el futuro una vez que estén disponibles.
Glenn Dufke, MVP de Embarcadero
Olaf Monien
Cuando Embarcadero anunció que abrirían ciertos proyectos para la colaboración de MVP, supe de inmediato que sería una gran oportunidad para arreglar y desarrollar código activamente y formar parte de un equipo amplio. XML Mapper también se subestima de alguna manera en términos de lo que puede hacer, por lo que fue tentador ayudar a mejorar su reputación. Mientras trabajaba con el proyecto, donde me recompensaron como líder de equipo, tuve la oportunidad de conocer a otros MVP muy talentosos, con los que tuve poco o ningún contacto anteriormente. Todos, como equipo, aprendimos varias técnicas valiosas, que fue (y sigue siendo) una gran experiencia.
Olaf Monien, coordinador regional de MVP y líder del equipo XML Mapper
Jason Chapman
Solo quería ayudar y ser parte del primer proyecto Embarcadero trabajando en estrecha colaboración con un grupo de MVP en una parte de código cerrado del IDE. Puedo ver que es una dirección de viaje asombrosa, es decir, lograr que la comunidad brillante y entusiasta pueda contribuir al producto real, lo cual es un gran paso desde las pruebas y los informes de problemas. Asistí a la mayoría de las reuniones semanales de stand-ups y miré algunos códigos y encontré un error oscuro al cambiar de monitores con diferentes DPI. La ambición del equipo con respecto al XML Mapper es grande y espero que podamos seguir trabajando en él y en otros complementos / partes del producto. Creo que hemos comenzado a construir una plantilla para futuras colaboraciones, mientras tenemos un tablero completo de tareas en las que seguir trabajando.
Jason Chapman, Coordinador Regional de MVP de Embarcadero
Miguel Angel Moreno
Hace algunos años utilicé XML Mapper como herramienta clave en algunos proyectos basados en XML. La tecnología se veía impresionante, pero sentí que no aproveché todo el poder que estas herramientas podían ofrecer … Ahora que el código XML Mapper se ha puesto a disposición de los MVP, estoy realmente emocionado de descubrir todas sus capacidades y características, y de ayudar a los desarrolladores de Delphi y C ++ Builder a comprender y explorar el poder que esta herramienta puede ofrecer, y en estos tiempos modernos donde la facturación electrónica y la contabilidad se están apoderando del mundo de manera lenta pero constante, no ha habido un mejor momento para aprovechar las características que XML Mapper tiene incorporado …
Miguel Angel Moreno, MVP de Embarcadero
Ricardo Boaro
Tener la oportunidad de trabajar en el proyecto XML Mapper es un gran honor, creo que es un gran incentivo como MVP ser parte de un proyecto como este. Compartimos ideas, aprendemos unos de otros, y quien gana es la comunidad de desarrolladores con un producto con mejoras y nuevas funciones. Gracias a todos en el equipo por la asociación, hoy puedo decir que tengo nuevos amigos. Gracias Embarcadero por brindarnos esta experiencia.
Ricardo Boaro, MVP de Embarcadero
¡Actualice su XML Mapper y esté atento a más actualizaciones de XML Mapper y otras versiones del proyecto MVP!
Wed Oct 14 2020 19:47:24 GMT+0700 (Western Indonesia Time)
Recentemente, lançamos uma nova experiência de abrir alguns projetos internos para os MVPs trabalharem. Ao contrário de algumas de nossas iniciativas de código aberto como o Bold, eles ainda são propriedade da Embarcadero e são uma parte principal do produto. Isso é algo em que os MVPs solicitaram a opção de se envolver por um tempo, então é muito emocionante finalmente dizer que está em pleno andamento e um sucesso.
O primeiro projeto experimental foi o XML Mapper e, há alguns dias, a primeira versão do XML Mapper atualizado está disponível via GetIt. Os principais objetivos desta primeira versão incluíram atualizar a interface do usuário, corrigir bugs existentes e melhorar a conformidade com os padrões do esquema XML, mas a equipe tem alguns grandes planos para o futuro do XML Mapper, então você verá muitas mais atualizações.
Se você der uma olhada no antigo XML Mapper antes de instalar o novo, verá como ele avançou.
UI original vs. atualizada
Assim como o RAD Studio, o XML Mapper suporta o tema claro e escuro e sincroniza as alterações do tema com o RAD Studio (e, em última análise, até mesmo o sistema operacional) automaticamente.
IU claro vs. escuro
Se, depois de instalar o novo XML Mapper, você quiser acessar o antigo XML Mapper por motivos nostálgicos, ou precisar desinstalar, o antigo XML Mapper é copiado e fica disponível para restauração. Você pode encontrá-lo na pasta C:\Users\Jim\Documents\Embarcadero\Studio\21.0\CatalogRepository\XMLMapper-27 renomeada como XmlMapper_old.exe.
Por último, gostaria de agradecer a todos os MVPs que estiveram envolvidos no teste e atualização do projeto XML Mapper, especialmente a equipe principal que se manteve neste projeto e viu o lançamento bem-sucedido, e que estão trabalhando duro em recursos e atualizações futuras.
Digite [ALT] + TEAM na tela sobre.
Pedi a cada um dos membros da equipe principal para compartilhar algumas idéias sobre seu envolvimento.
Roger Swann
Eu estava desconfiado de entrar no projeto XML MVP: ser um cara do C ++ e trabalhar neste sistema baseado em Delphi me deixou cauteloso. Acontece que eu realmente sinto que minha função de revisão de código fez uma contribuição pequena, mas útil, e é muito interessante trabalhar com um grupo de programadores habilidosos e experientes de diferentes origens (profissionais e geográficos), todos eles “jogadores de equipe” .
Roger Swann, Embarcadero C ++ MVP
Glenn Dufke
XML Mapper é uma ferramenta incrivelmente valiosa e útil para desenvolvedores, ele precisava de várias atualizações para corrigir bugs e oferecer suporte a recursos de esquema XML mais recentes. Quando a Embarcadero anunciou que os MVPs poderiam contribuir para projetos específicos que fazem parte da instalação do IDE, eu imediatamente me juntei para ajudar com o XML Mapper e torná-lo ainda melhor. A experiência de colaboração também fomentou uma grande equipe de desenvolvedores talentosos onde podemos aproveitar as experiências uns dos outros em escala global e resultou em um grande avanço do XML Mapper, tudo graças à equipe. Com certeza irei me juntar a mais projetos no futuro, assim que estiverem disponíveis.
Glenn Dufke, Embarcadero MVP
Olaf Monien
Quando a Embarcadero anunciou que abriria certos projetos para colaboração MVP, eu soube imediatamente que seria uma grande oportunidade de corrigir e desenvolver ativamente o código, tornando-se parte de uma grande equipe. O XML Mapper também é subestimado em termos do que pode fazer, por isso era tentador ajudar a melhorar sua reputação. Enquanto trabalhava com o projeto, onde fui recompensado como líder de equipe, tive a chance de conhecer alguns outros MVPs muito talentosos, com os quais tive pouco ou nenhum contato anteriormente. Todos nós, como equipe, aprendemos várias técnicas valiosas, o que foi (e ainda é) uma ótima experiência!
Olaf Monien, Coordenador Regional MVP e Líder da Equipe de Mapeador XML
Jason Chapman
Eu só queria ajudar e fazer parte do primeiro projeto da Embarcadero trabalhando junto com um grupo de MVPs em uma parte de código fechado do IDE. Posso ver que é uma direção de viagem incrível, ou seja, fazer com que a comunidade brilhante e entusiasmada seja capaz de contribuir com o produto real, o que é um grande passo depois de testar e relatar problemas. Eu participei da maioria das reuniões semanais de stand-ups e olhei alguns códigos e encontrei um bug obscuro na troca de monitores com DPIs variados. A ambição da equipe em relação ao XML Mapper é grande e espero que possamos continuar a trabalhar nele e em outros add-ons / partes do produto. Acho que começamos a construir um modelo para colaborações futuras, embora tenhamos um quadro completo de tarefas para continuar trabalhando.
Jason Chapman, Coordenador Regional do Embarcadero MVP
Miguel Angel Moreno
Alguns anos atrás, usei XML Mapper como a ferramenta-chave em alguns projetos baseados em XML. A tecnologia parecia impressionante, mas eu senti que não tirei proveito de todo o poder que essas ferramentas podem oferecer … Agora que o código XML Mapper foi disponibilizado para MVPs, estou realmente animado para descobrir todos os seus recursos e capacidades, e para ajudar os desenvolvedores Delphi e C ++ Builder a entender e explorar o poder que esta ferramenta pode oferecer, e nos dias modernos, onde o faturamento eletrônico e a contabilidade estão lenta, mas constantemente, tomando conta do mundo, não houve melhor momento para aproveitar os recursos que o XML Mapper possui embutido…
Miguel Angel Moreno, Embarcadero MVP
Ricardo Boaro
Ter a oportunidade de trabalhar no projeto XML Mapper é uma grande honra, acho que é um grande incentivo como MVP fazer parte de um projeto como este. Compartilhamos ideias, aprendemos uns com os outros e quem ganha é a comunidade de desenvolvedores com um produto com melhorias e novos recursos. Obrigado a todos da equipe pela parceria, hoje posso dizer que tenho novos amigos. Obrigado Embarcadero por nos proporcionar esta experiência.
Ricardo Boaro, Embarcadero MVP
Portanto, atualize seu XML Mapper e fique atento a mais atualizações de XML Mapper e outros lançamentos de projeto MVP!
Wed Oct 14 2020 19:46:56 GMT+0700 (Western Indonesia Time)
Недавно мы запустили новый эксперимент по открытию некоторых внутренних проектов для MVP. В отличие от некоторых наших инициатив с открытым исходным кодом, таких как Bold, они по-прежнему принадлежат Embarcadero и являются основной частью продукта. Это то, чем MVP просили принять участие в течение некоторого времени, поэтому очень интересно, наконец, сказать, что это идет полным ходом и успешно.
Первым экспериментальным проектом был XML Mapper, и несколько дней назад первый выпуск обновленного XML Mapper доступен через GetIt. Основные цели этого первого выпуска включали обновление пользовательского интерфейса, исправление существующих ошибок и улучшение соответствия стандартам схемы XML, но у команды есть большие планы на будущее XML Mapper, поэтому вы увидите еще много обновлений.
Если вы посмотрите на старый XML Mapper перед установкой нового, вы увидите, как далеко он продвинулся.
Оригинальный и обновленный интерфейс
Как и RAD Studio, XML Mapper поддерживает как светлую, так и темную тему, и он автоматически синхронизирует изменения темы с RAD Studio (и в конечном итоге даже с ОС).
Свет против темного интерфейса
Если после установки нового XML Mapper вы хотите получить доступ к старому XML Mapper по ностальгическим причинам или вам нужно удалить его, будет создана резервная копия старого XML Mapper, и он будет доступен для восстановления. Вы можете найти его в папке C:\Users\Jim\Documents\Embarcadero\Studio\21.0\CatalogRepository\XMLMapper-27, переименованной в XmlMapper_old.exe.
Наконец, я хочу поблагодарить всех MVP, которые участвовали в тестировании и обновлении проекта XML Mapper, особенно основную команду, которая придерживалась этого проекта и довела его до успешного выпуска, и кто работает жёстко о будущих функциях и обновлениях.
Введите [ALT] + КОМАНДА на экране информации.
Я попросил каждого из основных членов команды поделиться некоторыми мыслями об их участии.
Roger Swann
Я опасался присоединиться к проекту XML MVP: то, что я был парнем на C ++ и работая над этой системой на основе Delphi, заставляло меня осторожничать. Оказалось, что я чувствую, что моя роль по обзору кода внесла небольшой, но полезный вклад, и очень интересно работать с группой опытных знающих программистов с разным опытом (как профессиональным, так и географическим), все из которых являются «командными игроками». .
Роджер Суонн, Embarcadero C ++ MVP
Glenn Dufke
XML Mapper — невероятно ценный и полезный инструмент для разработчиков, ему потребовалось несколько обновлений для исправления ошибок и поддержки новых функций схемы XML. Когда Embarcadero объявил, что MVP могут внести свой вклад в конкретные проекты, которые являются частью установки IDE, я сразу же присоединился, чтобы помочь с XML Mapper и сделать его еще лучше. Опыт совместной работы также способствовал созданию отличной команды талантливых разработчиков, где мы можем использовать опыт друг друга в глобальном масштабе, и привел к огромному развитию XML Mapper, и все это благодаря команде. Я обязательно присоединюсь к другим проектам в будущем, когда они станут доступны.
Гленн Дафке, MVP Embarcadero
Olaf Monien
Когда Embarcadero объявил, что они откроют определенные проекты для сотрудничества MVP, я сразу понял, что это будет отличная возможность активно исправлять и развивать код и стать частью большой команды. XML Mapper также почему-то недооценивается с точки зрения того, что он может делать, поэтому было заманчиво помочь улучшить его репутацию. Во время работы над проектом, где я был вознагражден как руководитель группы, у меня была возможность встретить некоторых других очень талантливых MVP, с которыми я раньше практически не контактировал. Мы все, как команда, выучили несколько ценных техник, что было (и остается) отличным опытом!
Олаф Моньен, региональный координатор MVP и руководитель группы XML Mapper
Jason Chapman
Я просто хотел помочь и принять участие в первом проекте Embarcadero, тесно сотрудничая с группой MVP над частью среды IDE с закрытым исходным кодом. Я вижу, что это удивительное направление движения, то есть заставить яркое и увлеченное сообщество внести свой вклад в реальный продукт, что является отличным шагом вперед от тестирования и сообщения о проблемах. Я присутствовал на большинстве еженедельных встреч, просмотрел код и обнаружил непонятную ошибку при переключении мониторов с различным DPI. Амбиции команды в отношении XML Mapper велики, и я надеюсь, что мы сможем продолжить работу над ним и другими надстройками / частями продукта. Я думаю, что мы начали создавать шаблон для будущего сотрудничества, имея при этом полный набор задач, над которыми нужно продолжать работу.
Несколько лет назад я использовал XML Mapper в качестве ключевого инструмента в некоторых проектах на основе XML. Технология выглядела впечатляюще, но я чувствовал, что не воспользовался всей мощью, которую могли предложить эти инструменты … Теперь, когда код XML Mapper стал доступным для MVP, я действительно рад открыть для себя все его возможности и функции, а также помочь разработчикам Delphi и C ++ Builder понять и изучить возможности, которые может предложить этот инструмент, и в наши дни, когда электронное выставление счетов и бухгалтерский учет медленно, но неуклонно захватывают мир, сейчас самое лучшее время для использования этих функций этот XML Mapper имеет встроенный …
Мигель Анхель Морено, MVP Embarcadero
Ricardo Boaro
Возможность работать над проектом XML Mapper — большая честь, я думаю, что это отличный стимул для MVP стать частью такого проекта. Мы делимся идеями, учимся друг у друга, и кто побеждает, так это сообщество разработчиков с продуктом с улучшениями и новыми функциями. Спасибо всем в команде за партнерство, сегодня я могу сказать, что у меня появились новые друзья. Спасибо Embarcadero за предоставленный нам опыт.
Рикардо Боаро, MVP Embarcadero
Так что обновите свой XML Mapper и следите за новыми обновлениями XML Mapper и другими выпусками проекта MVP!
Wed Oct 14 2020 18:14:37 GMT+0700 (Western Indonesia Time)
Last month I had the pleasure to be invited by the Brazil-Israel (BRIL) Chamber of Commerce to participate in a webinar about Artificial Intelligence (in Portuguese).
In the slides and video below, I present several applications of Machine Learning and their impact on our lives, including Recommender Systems and Autonomous Vehicles.
Tue Oct 13 2020 06:15:43 GMT+0700 (Western Indonesia Time)
Immer wieder hören wir von Kunden und Interessenten, daß sie einen Download von unserer Webseite nicht durchführen können. Ausprägungen sind „Sitzung abgelaufen“ / „Session expired“ oder man kann sich mit einem bestehenden Account erst gar nicht anmelden.
In den meisten (11-und-neunzig Prozent aller Fälle) liegt das an einem AdBlocker (oder einem entsprechendem DNS-Resolver, der dazwischenfunkt; wie etwa „PiHole“) und dem Zulassen bzw dem Verhindern von Cookies.
Was ist das Problem?
Man versucht sich eine Trial oder eine Community Edition herunterzuladen. Auf den entsprechenden Webseiten (Trial Delphi, Trial C++Builder oder Trial RAD Studio bzw der Community Edition für Delphi oder C++Builder) gibt es zwei Möglichkeiten sich für die Version anzumelden.
Entweder erzeugt man hier gleich einen neuen Benutzeraccount (Auch EDN oder DN Account genannt / „[Embarcadero] Developer Account“)
Man loggt sich mit einem bereits vorhanden Account ein
….dann kann man sich einloggen
Das Downloadproblem kann gleichermaßen bei beiden Varianten entstehen (Neuanlagen eines Account oder über das Einloggen). Und man erhält nach dem Ausfüllen des Formulars den lapidaren Hinweis „Sitzung abgelaufen“ bzw „Session expired“
Was ist der Grund?
Wir setzen auf einige Hintergrundinformationen, die per Cookie gesetzt werden. Können nicht alle Informationen gespeichert werden, dann bekommt man den Hinweis der abgelaufenen Sitzung….. was etwas irreleitend ist.
Was ist die Lösung?
Diese drei Dinge gilt es zu beachten:
Erlauben Sie die Cookies, auf der Webseite:
Schalten Sie Ihren AdBlocker aus (temporär)
Das kann auf sehr unterschiedliche Weise passieren. Das ist abhängig vom eingesetztem AdBlocker
Schalten Sie einen manipulierenden DNS-Server aus; zB PiHole (temporär)
Auch das kann, je nach eingesetztem DNS-Resolver, unterschiedliche aussehen.
Für viele/etliche Leute ist es am einfachsten (unter Windows) einfach mal den Internet-Explorer (temporär) zu verwenden, da hier zumeist kein Werbeblocker oder sonstige „Sicherheitssoftware“ installiert ist.
Sat Oct 10 2020 21:18:41 GMT+0700 (Western Indonesia Time)
Keynote Especial com Marco Cantù, Jim McKeeth e David Millington no Embarcadero Conference 2020
Estamos na reta final das inscrições para o Embarcadero Conference 2020 (saiba tudo a respeito aqui em meu último post)!
E aqui temos mais uma razão pela qual você não pode ficar de fora do evento deste ano.
A apresentação principal estará a cargo de Marco Cantù – Delphi Product Manager, David Millington – C++ Product Manager e Jim McKeeth – Chief Developer Advocate & Engineer, discutindo o Roadmap do produto, iniciativas e projetos para toda a comunidade!
Apenas para reforçar, sua entrada equivale ao valor de uma cesta básica – a qual será doada para aqueles que mais estão precisando neste momento. Venha enriquecer seu conhecimento e de sua equipe, e ainda faça o bem!
Thu Oct 08 2020 19:20:49 GMT+0700 (Western Indonesia Time)
Unsere Neuorientierung auf Qualitätssicherung und Fehlerbehebungen für C++Builder war noch nie so deutlich wie in 10.4.1. Wir danken Ihnen für Ihre Geduld, die wir nicht für selbstverständlich halten. Wir waren niemals zuvor so motiviert, auf dem soliden Fundament von C++Builder weiter zu entwickeln und werden diesen Vorstoß in späteren Versionen im Laufe des Jahres fortsetzen.
Einige Highlights in diesem Release:
Der Win64-Debugger, der auf LLDB basiert, hat einige wichtige Qualitätsverbesserungen und neue Funktionen erhalten. Zum Beispiel hat er jetzt eine stark verbesserte Leistung für Anwendungen mit Hunderten von Threads; Verbesserungen bei der Behandlung von Exceptions, insbesondere von Betriebssystem-Exceptions; die Behandlung von Speicheränderungen in komplexen Variablen (z.B. wenn sich der Zeiger eines Zeigers auf ein Element ändert, wird dies in der IDE reflektiert); und viele andere Korrekturen in einer Vielzahl von Bereichen, sowie einen neuen Formatierer (Visualiser) für unique_ptr.
Der Win64-Linker (ilink64) bietet eine Reihe von Verbesserungen in der Speicherverwaltung, um Kunden zu unterstützen, die auf Speicherprobleme stoßen, insbesondere bei Debug-Builds.
Wichtige Qualitätsverbesserungen in der gesamten Toolchain, die von Midas über Exception-Behandlung über RTTI bis hin zur Stabilität reichen.
Unser Ziel ist es, C++Builder wieder zu einer stabilen und effizienten IDE zu machen. Sobald wir mit dem Fundament zufrieden sind, werden wir uns größeren und besseren Dingen zuwenden. Wir hoffen, die Code-Vervollständigung zu aktualisieren und den Win64-Linker im Laufe des nächsten Jahres vollständig zu ersetzen, was eine viel bessere Produktivität in der IDE ermöglichen und Sie bei der Verknüpfung großer Projekte unterstützen wird. Freuen Sie sich auf weitere Neuigkeiten, wenn 10.4.2 erscheinen wird.
Status der Visual-Assist-Integration in RAD Studio
Auf unserer Roadmap steht die Integration von Visual Assist in C++Builder. Für die erste Version konzentrieren wir uns zunächst auf die Top-Features, wie Code-Vervollständigung, Referenzsuche, Navigation und Refactorings. Dies ist bereits in Arbeit. Der C++-Parser von Visual Assist erkennt momentan unsere C++-Erweiterungen (Eigenschaften, Schließungen usw.), und wir prüfen verschiedene Ansätze zur IDE-Integration. Um mehr über Visual Assist zu erfahren, werfen Sie einen Blick auf https://www.wholetomato.com/features. Probieren Sie Visual Assist aus, und wenn es Funktionen gibt, die wir in C++Builder hinzufügen sollten, senden Sie uns eine Funktionsanfrage.
C++-Bibliotheken
Unsere Arbeit an der Steigerung der C++Builder-Kompatibilität ist im Gange, und wir sehen sehr gute Ergebnisse. Sie erinnern sich vielleicht an einen früheren Blog-Beitrag, dass wir gängige Open-Source-C++-Bibliotheken aufnehmen und sicherstellen, dass sie mit C++Builder funktionieren. (Mehrere neue werden demnächst auf GetIt erscheinen.) Das bedeutet nicht nur, dass Ihnen auf diese Weise nützliche gängige Bibliotheken leichter zur Verfügung stehen, sondern auch, dass Sie mit größerer Wahrscheinlichkeit jede C++-Bibliothek, die Sie verwenden möchten, leichter abrufen können.
Diese Bemühungen haben bereits Früchte getragen: Wir haben nicht nur etliche Bibliotheken in GetIt und es werden ständig mehr, sondern die zu leistende Arbeit zur Verwendung einer Bibliothek in C++Builder hat sich geändert. Heutzutage ist es normalerweise unkompliziert, Code für MSVC oder GCC so durch Makros (ifdef-s) zu erweitern, um auch Embarcadero spezifischen Code zu verpacken. Die überwiegende Mehrheit der RTL oder anderen Methoden existieren und die Bibliotheken können direkt verwendet werden. Häufig wird eine Bibliothek sofort kompiliert. Wenn Sie eine Bibliothek haben, an der Sie interessiert sind, empfehlen wir, sie mit C++Builder 10.4.1 auszuprobieren: Möglicherweise müssen kleine Änderungen vorgenommen werden, aber die Gesamtkompatibilität sollte erheblich verbessert sein.
Desktop UX Summit
In den letzten zehn Jahren hat sich das Anwendungsdesign stark auf mobile oder Webanwendungen konzentriert. Das Webdesign hat dabei das Design anderer Anwendungen stark beeinflusst – oft zum Nachteil. Eine Desktop- oder mobile Anwendung ist keine Website.
In diesem Jahr fand zum ersten Mal der Desktop UX Summit statt – eine kostenlose Online-Konferenz zum Thema Desktop-Anwendungsdesign, an der eine Vielzahl von Referenten teilgenommen haben, die häufig nicht mit Embarcadero-Technologien verbunden sind oder diese nicht nutzen. Wir möchten das Bewusstsein für Desktop-Anwendungsdesign nicht nur unseren eigenen Kunden, sondern den Entwicklern im Allgemeinen vermitteln. Die Konferenz bietet einige großartige Sitzungen und ist kostenlos!
Neues Gratis-Tool: Dev C++
Im Zuge der Neubelebung in der Herstellung von Qualitätswerkzeugen für die C++-Entwicklung möchten wir Ihnen auch unseren neuesten Open Source-Text-Editor mit geringem Platzbedarf, Embarcadero Dev-C++, vorstellen:
Embarcadero Dev-C++ ist eine neue und verbesserte Variante von Bloodshed Dev-C++ und Orwell Dev-C++. Es ist eine voll funktionsfähige IDE und ein Code-Editor für die Programmiersprache C/C++. Es verwendet die MinGW-Portierung von GCC (GNU Compiler Collection) als Compiler. Embarcadero Dev-C++ kann auch in Kombination mit Cygwin oder jedem anderen GCC-basierten Compiler verwendet werden. Wir waren in der Lage, dieses Paket mit einem sehr geringen Speicherbedarf zu erstellen, da es eine native Windows-Anwendung ist und Electron nicht verwendet. Um das Ganze abzurunden, wurde die gesamte Arbeit zur Aktualisierung dieses Forks mit der neuesten Version von Embarcadero Delphi durchgeführt. Dieses und andere kostenlose Tools können unter https://www.embarcadero.com/free-tools/dev-cpp heruntergeladen werden.
C++-Nachrichten weltweit
Zum Schluss noch eine Zusammenfassung der neuesten C++-Nachrichten und Blog-Einträge!
MeetingC++, eine der führenden C++-Konferenzen, ist dieses Jahr online. Sie läuft in der mitteleuropäischen Zeitzone und kostet 49 € für Frühbucher.
Die Jahrestagung der LLVM (Clang, LLDB) meeting ist dieses Jahr ebenfalls online. Die Eintrittskarten sind kostenlos, Sie können jedoch auch eine bezahlte Fördererkarte kaufen.
‚Das Problem mit C‘: ein wirklich interessanter Beitrag von cor3ntin darüber, wie sich die Sprachen unterscheiden und was C-Kompatibilität für C++ bedeutet
David I hat einen tollen Blog-Eintrag geschrieben, der die Verwendung einiger Boost-Klassen mit C++Builder zeigt. (Eine aktuelle Version von Boost ist in GetIt.) Insbesondere zeigt er die Ringspeicherklasse. Boost ist voll von nützlichen Werkzeugen, und es ist großartig, einige von ihnen vorgestellt zu bekommen.
Adecc Systemshaus veröffentlicht einen C++ Blog. Dabei gibt es einige großartige Beiträge insbesondere über die Verwendung von Standard-C++-Streams, wie z.B. C++-Streams mit einem TListView.
Incredibuild, Hersteller eines hervorragenden Buildsystems zur Verteilung von C++-Builds auf verschiedene Maschinen, hat eine Umfrage zu Ihrer bevorzugten C++-IDE und zum Zeitpunkt der Erstellung Ihrer Anwendungen durchgeführt – Visual Studio, C++Builder und ‚Andere‘ waren zu jeweils etwa 30% beteiligt.
Und schließlich wurde C++20 fertiggestellt! Lesen Sie mehr in Herb Sutter’s Blog.
Wed Oct 07 2020 22:54:58 GMT+0700 (Western Indonesia Time)
Wenn Ihr Unternehmen Software entwickelt, die Sie für bestimmte vertikale / horizontale Branchen verkaufen, sollten Sie dieses Webinar nicht verpassen!
In Abwechslung zu den normalen technischen Sitzungen wird Mary Kelly mit mir, Stephen Ball, zusammen mit mir die Welt der ISVs erkunden, ISV-Geschäftsmodelle diskutieren und erläutern, wie Unternehmen auf der ganzen Welt mit InterBase höhere Renditen erzielen. InterBase ist heute wirklich eine Datenbank, vor allem dank der nahezu Null-Verwaltung und der einfachen Installation.
Anhand von Beispielen aus der Finanz-, Medizin- und Freizeitbranche erfahren Sie, wie InterBase es Unternehmen ermöglicht, schneller zu innovieren, die Markteinführungszeit zu verkürzen, das Kundenerlebnis zu verbessern, Markttrends zu verfolgen und vor allem gleichzeitig davon zu profitieren .
15. Oktober – Wie ISVs dank InterBase die Innovation beschleunigen und gleichzeitig die Kosten senken
Wed Oct 07 2020 21:50:34 GMT+0700 (Western Indonesia Time)
Если ваша компания занимается разработкой программного обеспечения, которое вы продаете для конкретных отраслевых вертикалей / горизонтальных секторов, то этот веб-семинар нельзя пропустить!
В отличие от обычных технических сессий, Мэри Келли присоединится ко мне, Стивену Боллу, когда мы исследуем мир ISV, обсудим бизнес-модели ISV и то, как компании во всем мире получают более высокую прибыль благодаря InterBase. На сегодняшний день InterBase в значительной степени является базой данных, особенно благодаря почти нулевому администрированию и простой установке.
Из реальных примеров из финансового, медицинского и развлекательного секторов вы узнаете, как InterBase позволяет компаниям быстрее внедрять инновации, сокращать время вывода на рынок, улучшать качество обслуживания клиентов, идти в ногу с рыночными тенденциями и, что важно, получать от них прибыль то же время.
15 октября — Как независимые поставщики программного обеспечения ускоряют внедрение инноваций при сокращении затрат благодаря InterBase
Wed Oct 07 2020 21:50:14 GMT+0700 (Western Indonesia Time)
Se sua empresa está desenvolvendo software que você vende para setores verticais / horizontais específicos da indústria, então este webinar é imperdível!
Em uma mudança das sessões técnicas normais, Mary Kelly se juntará a mim, Stephen Ball, enquanto exploramos o mundo dos ISVs, discutimos os modelos de negócios dos ISVs e como as empresas em todo o mundo estão obtendo retornos maiores, graças ao InterBase. InterBase é um banco de dados para hoje, especialmente graças à sua administração quase nula e instalação simples.
Com estudos de caso do mundo real dos setores Financeiro, Médico e de Lazer, você aprenderá como o InterBase está permitindo que as empresas inovem mais rapidamente, reduzam o tempo de entrada no mercado, melhorem as experiências do cliente, acompanhem as tendências do mercado e, mais importante, lucrem com eles no mesmo tempo.
15 de outubro – Como os ISVs estão acelerando a inovação e reduzindo custos, graças ao InterBase
Horas locais 15 de outubro, 9h CDT (Austin) 15 de outubro, 10h EDT (Nova York) 15 de outubro, 15h BST (Londres) 15 de outubro, 16h CET (Berlim) 15 de outubro, 17h MSK (Moscou) 15 de outubro, 19h30 IST (Mumbai) 15 de outubro, 23h JST (Tóquio)
Wed Oct 07 2020 21:49:36 GMT+0700 (Western Indonesia Time)
Si su empresa está desarrollando software que vende para sectores verticales / horizontales específicos de la industria, ¡este seminario web es uno que no debe perderse!
En un cambio de las sesiones técnicas normales, Mary Kelly se unirá a mí, Stephen Ball, mientras exploramos el mundo de los ISV, discutimos los modelos comerciales de los ISV y cómo las empresas de todo el mundo están obteniendo mayores retornos, gracias a InterBase. InterBase es en gran medida una base de datos para hoy, especialmente gracias a su administración casi nula y su sencilla instalación.
Con estudios de casos reales de los sectores financiero, médico y de ocio, aprenderá cómo InterBase permite a las empresas innovar más rápido, reducir el tiempo de comercialización, mejorar las experiencias de los clientes, mantenerse al día con las tendencias del mercado y, lo que es más importante, beneficiarse de ellas en el Mismo tiempo.
15 de octubre: cómo los ISV están acelerando la innovación al tiempo que reducen los costos, gracias a InterBase
Horarios locales 15 de octubre, 9 AM CDT (Austin) 15 de octubre, 10 AM EDT (Nueva York) 15 de octubre, 3 PM BST (Londres) 15 de octubre, 16:00 CET (Berlín) 15 de octubre, 5 PM MSK (Moscú) 15 de octubre, 7.30 PM IST (Mumbai) 15 de octubre, 11 PM JST (Tokio)
Wed Oct 07 2020 15:40:15 GMT+0700 (Western Indonesia Time)
Venha para o Conference 2020 Virtual! Eu garanto que você vai se surpreender (mais uma vez)!
Eis que, após 7 anos consecutivos ajudando a produzir o Embarcadero Conference em seu modelo presencial, tivemos que esquecer tudo o que sabíamos e começar um planejamento do zero!
Não que não estejamos acostumados com eventos virtuais, webinars, etc., definitivamente não é este o caso. Mas produzir uma verdadeira conferência em um meio totalmente virtual é um desafio novo para todos nós.
Nós trabalhamos muito nos últimos meses, e os detalhes finais estão sendo ajustados. Eu garanto que você vai se surpreender com o que vai encontrar, a qualidade das palestras, e tudo mais!
Aqui vai um breve resumo do que você pode esperar:
48+ palestras de altíssimo nível técnico
Keynote especial com Marco Cantù, Jim McKeeth e David Millington
Plantão de dúvidas com nossos super MVPs
E tudo isso será 100% gravado e disponibilizado (somente) aos inscritos!
Para não ficar somente nas questões técnicas, a sua participação também vai ajudar alguém que está precisando muito. Cada inscrição tem o valor de uma cesta básica, e 100% da arrecadação será convertida e doada diretamente aos que mais estão necessitando neste momento.
Uma outra novidade, dirigida ao publico acadêmico: teremos uma trilha exclusiva para eles. Esta trilha tem uma entrada especial, e corresponde a doação de um Kit Higiene, o qual também será direcionado as comunidades que mais precisam.
Portanto, estou aqui para reforçar o convite: faça sua parte, atualize seu conhecimento técnico, e de toda sua equipe, e ainda pratique o bem!
Tue Oct 06 2020 14:40:35 GMT+0700 (Western Indonesia Time)
Hello, and welcome to this series! 👋 I’m Daniel, a software engineer at RisingStack, and I’ll be your guiding hand to get to learn Dart and Flutter.
This series is aimed at those who know React-Native, JavaScript, or web development and are trying to get into cross-platform mobile development because I’ll be comparing Dart language examples to JavaScript ones, and Flutter with React and React-Native.
However, if you don’t know any of these technologies yet, don’t let that throw you off from this series - I’ll explain core concepts thoughtfully. Let’s get started!
Let's learn the Dart language as JS developers: We dive into OOP, classes, inheritance, and mixins, asynchrony, callbacks, async/await and streams.
Flutter and Dart are made by Google. While Dart is a programming language, Flutter is a UI toolkit that can compile to native Android and iOS code, has experimental web and desktop app support, and it’s the native framework for building apps for Google’s Fuchsia OS.
This means that you don’t need to worry about the platform, and you can focus on the product itself. The compiled app is always native code as Dart compiles to ARM, hence providing you the best cross-platform performance you can get right now with over 60 fps. Flutter also helps the fast development cycle with stateful hot reload, which we’ll make use of mostly in the last episode of this series.
By the end of this series, you’ll have a basic understanding of Dart, the basic data structures, object-oriented programming, and asynchrony with futures and streams.
In Flutter, you’ll take a look at widgets, theming, navigation, networking, routing, using third-party packages, native APIs, and a lot more. Then, in the last episode of this series, we’ll put it all together and build a full-blown minigame together! Seems exciting? Then keep reading!
This episode of the series focuses on the Dart part of this ecosystem. We’ll look into Flutter in the next episode, and then we’ll put it all together into a fun minigame in the last episode. I’m excited to see what you’ll all build with Flutter, so let’s jump right in!
Sidenote: throughout this series, I'll use the “👉” emoji to compare JS and Dart language examples. Typically, the left side will be the JS, and the right side will be the Dart equivalent, e.g. console.log("hi!"); 👉 print("hello!");
Dart vs JavaScript - the pros and cons
JavaScript and Dart cannot be directly compared as they both have different use cases and target audiences. However, they both have their own advantages and disadvantages, and after a few projects with both technologies, you’ll get to see where they perform well.
There are some things, however, that you’ll notice as you are getting into the Flutter ecosystem: Dart has a steeper learning curve with all those types, abstract concepts and OOP - but don’t let that throw you off your track.
JavaScript has a bigger community, and hence more questions on StackOverflow, more packages, resources, learning materials, and meetups.
But once you get the hang of Dart, you’ll notice that Dart and Flutter has much-much better developer tooling, it’s faster, and compared to pub.dev, (Dart’s package repository) npm has more packages with worse quality.
Variables and types in the Dart language
After the first glance at a Dart code snippet, you may notice a concept that you may be unfamiliar with if you only know JS. Dart is type safe.
It means that when you want to define a variable, you’ll either have to provide an initial value and let the compiler figure out what type matches it (implicit typing), or (and this is the optimal case) you’ll have to provide the type of the variable explicitly.
In programming, types define what kind of data you are trying to store in your variable - for example, with an int type, you’ll be able to store an integer number (e.g. 7). In Dart, the most commonly used primitive types are int, double, string and boolean. Here are some language examples:
// Heads up! This is some nasty Dart code!
var num = 0; // Dart will implicitly give this variable an int type. var, let 👉var
int myInt = 3; // this is an explicitly typed variable
final double pi = 3.14; // const 👉final, static and const, more info below
myInt = 3.2; // will throw an error as 3.2 is not an integer
pi = 3.2; // will throw an error as pi is marked with final
String name = "Mark";
There’s also a “fallback-type” or a non-typed type: dynamic. In Dart, the dynamic type can be used whenever the exact type of a parameter, argument, list item, or anything else cannot be determined while writing your code. Please always be extra careful when working with dynamically typed variables and add extra safety barriers to your code so that your app doesn’t crash when an unexpected type gets passed. Try to avoid using dynamic as much as possible.
Oh, and a quick tip: to play around with Dart, you can use DartPad. It’s an online Dart compiler, or a “playground” made by the Dart team.
A few words about final, static and const
In Dart, we can create constants with three keywords: final, static, and const. final can be only created once in the runtime, while const is created at compile-time. You can think of const as an even stricter final. (When in doubt, you can use final and you’ll be just fine. To read more about the keywords final, static, and const, check out this article on the official Dart blog.
To get to know more about variables and the built-in types in Dart, please refer to this short explanation.
Writing your first Dart language function
Type-safety will come up in a lot of places - for example, when writing functions, you’ll have to define the return type and the type of the arguments.
// return type, function name, parameters with their types and names
double addDoubles(double a, double b) {
return a + b;
}
addDoubles(3.2, 1.4); // => will return 4.6
And when your function doesn’t return anything, you can throw in the keyword void - just like the entry point of every Dart program, void main() does.
void main() {
print(addNumbers(2, 3)); // console.log() 👉print()
// this function does not return anything!
}
What’s an entry point anyways? In JavaScript, the code starts executing from the first line and goes linearly line-by-line until it reaches the end of the file. In Dart, you have to have a main() function that will serve as the body of your program. The compiler will start the execution with the main function, that’s where it enters your code - hence the name entry point.
Control flow statements - if, for, while, etc.
They look and work just like in JavaScript. Here are some examples:
int age = 20;
if(age >= 18) {
print("here’s some beer! 🍻");
} else {
print("🙅♂️sorry, no alcohol for you...");
}
// let’s count from 1 to 10!
// p.s.: notice the `int i`
for (int i = 1; i <= 10; i++) {
print("it’s number $i"); // string interpolation: ${} 👉 $ (for variable names)
}
// while loops:
// please don’t run this snippet, it will probably crash or run out of resources...
while("🍌" == "🍌") { // oh, and forget ===, you don’t need it in Dart!
print("Hey! 👋 I’m a banana!");
}
Arrays and objects
In JavaScript, to store multiple pieces of data together, we use arrays and objects. In Dart, we call them lists and maps, and they work a bit differently under the hood (and they have some extra APIs!). Let’s look into them!
Array 👉List
In Dart, a list ideally stores an array of homogenous data . That’s right -- no more [1, "banana", null, 3.44] (ideally)! You can create a list with the [] syntax you are already familiar with from JS, and with the new List() constructor.
// the usual, implicitly typed, [] syntax
var continents = ["Europe", "North America", "South America", "Africa", "Asia", "Australia"];
continents.add("Antarctica"); // .push() 👉 .add()
// please note that when throwing in multiple types of data, Dart will fall back to the `dynamic` type for your list:
var maybeBanana = [1, "banana", null, 3.44];
// the `new List()` syntax, with a dynamic length:
// note the List<T> syntax: you need to pass in the desired value type between the <>s
List<int> someNiceNumbers = new List();
someNiceNumbers.add(5);
// fixed-length list:
List<int> threeNiceNumbers = new List(3); // this list will be able to hold 3 items, at max.
// dynamic list with the new List() syntax:
List<dynamic> stuff = new List();
stuff.add(3);
stuff.add("apple"); // this is still totally legit because of the <dynamic> type
Now that we’ve covered arrays, we can move on to objects. In JavaScript, objects store key-value pairs, and the closest we can get to this data structure in Dart is a Map. Just like we saw at the List, we can define a Map both with the { ... } literal and with the new Map() constructor.
// the usual { ... } literal
var notesAboutDart = {
objects: "hey look ma! just like in JS!",
otherStuff: "idc we’ll look into them later"
};
// the new Map constructor
Map notesAboutJs = new Map();
// … and of course, you can explicitly type Maps!
// typed Map literal:
Map<String, int> prices = <String, int>{
"apple": 100,
"pear": 80,
"watermelon": 400
};
// typed Map constructor:
final Map<String, String> response = new Map<String, String>();
Knowing about these methods will be just enough for now - but if you want to get to know the advanced stuff like HashMaps right away, be sure to check out the API docs of the Map class.
Imports and exports
In JavaScript, you could simply expose values from your files with export or module.exports and refer to them in other files with import or require(...). In Dart, it’s both a bit more complex and simpler than that.
To simply import a library, you can use the import statement and refer to the core package name, a library name, or a path:
import 'dart:math'; // import math from “math” 👉import “math”;
// Importing libraries from external packages
import 'package:test/test.dart'; // import { test } from “test” 👉import “test/test”;
// Importing files
import 'path/to/my_other_file.dart'; // this one is basically the same
// Specifying a prefix
import 'dart:math' as greatMath;
But how about creating your own libraries or exporting stuff? Dart lacks the usual public, protected or private keywords that Java has for this purpose (sidenote: Dart is compared to Java a lot of times) and even the export keyword that we’re used to in JavaScript. Instead, every file is automatically a Dart library and that means that you can just write code without explicitly exporting stuff, import it in another file, and expect it to work out just fine.
If you don’t want Dart to expose your variable, you can (and should!) use the _ prefix. Here’s an example:
// /dev/a.dart
String coolDudes = "anyone reading this";
String _hiddenSuffix = “...with sunglasses on 😎";
// /dev/b.dart
import "./b.dart";
print("cool dudes: $coolDudes"); // => cool dudes: anyone reading this
print("cool dudes: $coolDudes $_hiddenSuffix") // => will fail as _hiddenSuffix is undefined in this context
Oh, and just a quick note about naming variables: camelCasing is considered a best practice, just like capitalizing abbreviations longer than two characters (e.g. HTTP => Http, or HttpConnectionInfo). To know more about writing efficient and stylish Dart code, make sure that you read the Effective Dart guide later on your journey, once you are confident with the basics.
A quick intro to OOP and classes
Dart is an object oriented language - but what does that mean for you?
If you don’t know OOP yet, that means that you’ll have to learn a brand new paradigm of programming that is utilized in many popular languages like Java, C#, and of course, Dart. While introducing you to OOP isn’t the main goal of this series, I’ll provide you a quick intro so that you can start off with Dart and Flutter.
The first thing to settle is that JavaScript isn’t either strictly OOP nor functional - it contains elements from both architectures.
It’s up to your preferences, the project you work on, and the desired target framework, to choose (if a strict decision is ever made) between the two concepts. On the other hand, Dart is pretty strict about being OOP.
Here’s a little chart I made to help you wrap your head around the main differences between functional and object-oriented programming:
To sum up: before OOP, there was procedural programming. There were a bunch of variables and functions lying around - and it was simple, but if often led to spaghetti code. To solve this, engineers came up with OOP, where we group related functions and variables into a unit. This unit is called an object, and inside it there are variables called properties and functions called methods. While creating this unit, always try to be descriptive. To practice making up these units, you can come up with real-world objects around you and try to describe them with properties and methods.
A car would, for example, have properties like their brand, color, weight, horse power, their license plate number and other stuff that can describe a car. Meanwhile it would have methods for acceleration, breaking, turning, etc.
Of course, you don’t have cars inside your code, so let’s put that abstract idea into code! A great example of a unit inside JS would be the window object. It has properties like the width and height of the window and has methods for resizing and scrolling.
The four principles of OOP are:
Encapsulation: Group variables (properties) and functions (methods) into units called objects.This reduces complexity and increases reusability.
Abstraction: You should not be able to directly modify the properties or access all methods - instead, think of writing a simple interface for your object. This helps you isolate the impact of changes made inside the objects.
Inheritance: Eliminate redundant code by inheriting stuff from another object or class. (Dart achieves this with mixins - we’ll look into concrete examples later). This helps you keep your code base smaller and more maintainable.
Polymorphism: Because of the inheritance, one thing can behave differently depending on the type of the referenced object. This helps you in refactoring and eliminating ugly ifs and switch/case statements.
Real-Life Dart Examples
If you are confused or intimidated by this concept, don’t worry. Looking at real-life Dart examples will help you wrap your head around this whole mess we call OOP. Let’s look at a simple class with some properties and a constructor.
class Developer {
final String name;
final int experienceYears;
// Constructor with some syntactic sugar
// a constructor creates a new instance of the class
Developer(this.name, this.experienceYears) {
// The code you write here will run when you construct a new instance of the Developer class
// e.g. with the Developer dev = new Developer(“Daniel”, 12); syntax!
// Notice that you don't have to explicitly type
// this.name = name;
// one by one. This is because of a Dart syntactic sugar
}
int get startYear =>
new DateTime.now().year - experienceYears; // read-only property
// Method
// notice the `void` as this returns nothing
void describe() {
print(
'The developer is $name. They have $experienceYears years of experience so they started development back in $startYear.');
if (startYear > 3) {
print('They have plenty of experience');
} else {
print('They still have a lot to learn');
}
}
}
And somewhere else in the code, you can construct a new instance of this class:
void main() {
Developer peter = new Developer("Peter", 12);
Developer aaron = Developer("Aaron", 2); // in Dart 2, the new keyword is optional
peter.describe();
// this well print this to the console:
// The developer is Peter. They have 12 years of experience so they started development back in 2008.
// They have plenty of experience.
aaron.describe();
// =>
// The developer is Aaron. They have 2 years of experience so they started development back in 2018.
// They still have a lot to learn.
}
And that’s it! You’ve just made your first Dart class with properties and methods. You used typed variables, get-only (protected) variables, control flow statements, got the current year and printed some stuff out to the console.
Congratulations! 🎉
Inheritance and mixins in Dart
Now while you have momentum, let’s have a peek at inheritance and mixins.
Once you have a solid knowledge of classes and start to think of more complex systems, you’ll feel the need for some way to inherit code from one class to another without copying and pasting code all over the place and making a big ol’ bowl of spaghetti. ❌🍝
For this reason, we have inheritance in OOP. When inheriting code from one class to another, you basically let the compiler copy and paste members of the class (“members” of the class are methods and properties inside a class), and add additional code on top of the previous class. This is where polymorphism kicks in: the same core code can exist in multiple ways by inheriting from a base class (the class you inherit from).
Think of HTML. There are several similar elements that HTML implements, like a TextBox, a Select or a Checkbox. They all share some common methods and properties like the click(), focus(), innerHTML, or hidden. With class inheritance, you can write a common class like HtmlElement and inherit the repetitive code from there.
How does this look in practice? In Dart, we use the extends keyword to inherit code from a base class. Let’s look at a short example:
// notice the extends keyword.
// we refer to the Developer class we defined in the previous snippet
class RisingStackEngineer extends Developer {
final bool cool = true;
String sunglassType;
RisingStackEngineer(String name, int experienceYears, this.sunglassType)
: super(name, experienceYears); // super() calls the parent class constructor
void describeSunglasses() {
print("$name has some dope-ass $sunglassType-type sunglasses.");
}
}
And what can this class do? Let’s look at this snippet:
void main() {
RisingStackEngineer berci = RisingStackEngineer("Bertalan", 300, "cool");
berci.describe(); // .describe(); is not defined on the RisingStackEngineer class directly - it’s inherited from the Developer class. We can still use it though!
berci.describeSunglasses(); // => Bertalan has some dope-ass cool-type sunglasses
}
Isn’t that amazing? Let’s make it even better with mixins. Mixins help you mix in more than one class into your hierarchy. For example, let’s give some keyboards for our developers:
class Keyboard {
int numberOfKeys = 101;
void describeKeyboard() {
print("The keyboard has $numberOfKeys keys.");
}
}
And use a mixin to create some sort of developer-keyboard hybrid person with Dart and the with keyword:
class WalkingKeyboard extends Developer with Keyboard {
// ...
}
And that’s it! If you want to practice Dart before we move on to our last topic for today (asynchronous programming), be sure to play around with DartPad, an online compiler made by the Dart team.
Write some statements, create some classes and maybe even inherit some code. Don’t just read - pause this article and write some code! Once you feel comfortable with these base concepts (typing your variables, writing lists, maps, using control flow statements, creating classes), we’ll move forward to asynchronous programming with Dart.
Asynchronous programming in the Dart Langauge
Writing asynchronous code is a must when communicating with a server, working with files, or using some native APIs. In JavaScript, we had callbacks and async/await for timing our code. To our luck, Dart utilizes the very same concepts and embraces async/await to avoid callback hell.
Let’s look at a callback example first:
// Promise 👉 Future
// the method return type is an asynchronous void
Future<void> printWithDelay(String message) {
// Future.delayed delays the code run with the specified duration
return Future.delayed(Duration(seconds: 1)).then((_) {
print(message);
});
}
void main() {
print("hey hi hello");
printWithDelay("this message is printed with delay");
}
And look at the very same code with async/await:
// notice that you have to add in the async keyword to be able to await a Future
Future<void> printWithDelay(String message) async {
await Future.delayed(Duration(seconds: 1));
print(message);
}
void main() {
print("hey hi hello");
printWithDelay("this message is printed with delay");
}
And that was it for the Promise 👉 Future part. If you’d like to know more about the Future API, be sure to read the documentation. But stay tuned! Dart has another API for handling asynchrony: Streams. 🤯
Streams in the Dart Language
Dart’s main advancement in asynchrony compared to many other languages is native support for streams. If you want to have a simple way to wrap your head around the difference between Futures and Streams, think of the following: Future handles “finished future” (e.g. a web API response) with a single value, while Streams handle continuous future (e.g. an asynchronous for loop) with zero or more values.
Consider the following chart:
How do you work with data received from Dart Streams? Whenever a new event happens in the stream (either new data is received or an error happened), Dart notifies a listener. A listener is a snippet of code that subscribes for events of a stream and processes data whenever an event is received. You can subscribe to a stream with the .listen() function, provide a callback and boom, there you go! Isn’t that easy? 🤩 Let’s look at an example to get the hang of it:
// this is an imaginative stream that gives us an integer every one second
final exampleStream = NumberCreator().stream;
// e.g. 1, 2, 3, 4, ...
// print the data received from the stream
final subscription = exampleStream.listen((data) => print(data););
By default, Dart streams only support one listener. Adding another listener to this stream would throw an exception - however, there is a tool that helps us adding multiple listeners to a single stream. Broadcast streams! You can just throw in .asBroadcastStream at the end of your stream and you’ll be able to add multiple listeners to your stream:
// same code but with a broadcast stream. Notice the .asBroadcastStream at the end!
final exampleStream = NumberCreator().stream.asBroadcastStream;
// and you’ll be fine adding multiple listeners
final subscription = exampleStream.listen((data) => print(data););
final subscription2 = exampleStream.listen((data) => print(data););
But while we’re at listeners, let’s have a closer look at that API. I mentioned that you could either receive data or an error in a stream: how can you handle errors? I made a bit more advanced listener with error handling below. You can also run code when a stream finishes sending data (won’t send data anymore), you can explicitly define if you want to cancel listening when an error occurs, and a lot more. Here’s the code:
final advancedSubscription = exampleStream.listen(
// this runs when new data is received
(data) {
print("data: $data");
},
// handle errors when one occurs
onError: (err) {
print("error: $err");
},
// do not cancel the subscription when an error occurs
cancelOnError: false,
// when the stream finishes, run some code.
onDone: () {
print("done!");
}
);
Oh, and if this wouldn’t be enough for you, you can do stuff with the subscription object itself too:
advancedSubscription.pause(); // pause the subscription
advancedSubscription.resume(); // resume the subscription
advancedSubscription.cancel(); // remove/cancel the subscription
There is still a lot more that can be done with streams in Dart: you can manipulate them, filter their data, and of course, we didn’t have a look at asynchronous iterators and creating streams - however, this should be just enough for you to start development with Flutter.
If you want to know more about asynchrony in Dart, check out the following videos made by the Flutter team:
And that’s it for asynchronous programming - for now!
Summing our beginner Dart tutorial up
Congratulations on making it this far into the course! 🎉 If it was a bit dry or heavy for you, don’t worry: this was a Dart-only episode. In this episode, we looked at a crap ton of stuff! We went from variables, types, and control flow statements to lists, maps, imports, and exports.
Then, we came to the heavier parts of the Dart ecosystem. We first had a look at why OOP exists, what are its pros, where it performs well, and then we looked at classes, inheritance, and mixins, and if that wouldn’t be enough, we even looked at asynchrony, callbacks, async/await and streams.
Don’t forget: if you want to practice all these new stuff we just learned about, you can always hit up DartPad and play around with it for a bit. (I even encourage you to do so as you’ll need to have a strong Dart knowledge to move on to Flutter).
In the next episode, we’ll look into Flutter: we’ll start with the CLI and a hello world app, and have a look at widgets, lists, styling, state management, props, routing, and networking - and in the last episode, we’ll put it all together and build a fun game. Until then, stay tuned!
Mon Oct 05 2020 22:24:58 GMT+0700 (Western Indonesia Time)
Wir haben gerade einen Patch für C ++ Builder 10.4.1 veröffentlicht, der sich auf die Verwendung von in C ++ geschriebenen Komponenten im Formular-Designer auswirkt. Dieser Patch behebt das folgende Problem:
Ereignishandler wurden in der IDE nicht immer mit einer kompatiblen Methodensignatur für den Ereignishandlertyp (RSP-29734) generiert.
Wenn Sie eine Komponente verwenden, die mit dem klassischen Compiler im Formulardesigner der IDE kompiliert wurde, generieren Sie einen Ereignishandler in der IDE (z. B. von Durch Doppelklicken auf einen Ereignishandlereintrag im Objektinspektor wurde häufig eine Methode mit einer mit dem Ereignis nicht kompatiblen Signatur erstellt, die den Fehler „Eigenschaft und Methode sind nicht kompatibel“ verursachte. Dies ist in diesem Hotfix behoben.
Sie sollten Ihre C ++ – Komponentenpakete (Design und Laufzeit) nach der Installation dieses Hotfixes neu erstellen oder eine aktualisierte Version von Ihrem Komponentenhersteller erhalten.
Patch installieren
Der Patch kann automatisch von der IDE installiert werden. Wenn Sie RAD Studio oder C ++ Builder öffnen, wird im Begrüßungsbildschirm ein Hinweis angezeigt, dass ein Update verfügbar ist. Wenn Sie darauf klicken, wird GetIt geöffnet. Sie können GetIt auch über das Menüelement Extras> Menüpunkt GetIt Package Manager öffnen und nach der Kategorie „Patches und Hotfixes“ suchen.
Da dieser Patch die von der IDE geladenen Dateien überschreibt, wird die IDE vor der Installation geschlossen. Dies ist das erste Mal, dass wir einen Patch veröffentlichen, den die IDE installiert, um die von der IDE selbst verwendeten Dateien zu ändern. Dies ist Teil unserer in 10.4 begonnenen Überarbeitung der Patch-Verteilung. Es ist großartige Technologie!
Die IDE wird geschlossen und einige Befehlszeilenfenster werden geöffnet. Achten Sie in der Taskleiste auf eine blinkende Eingabeaufforderung zum Erhöhen von Berechtigungen, da das Installationsprogramm erhöhte Berechtigungen benötigt, um Dateien in Ihrem Ordner „Programme“ zu installieren.
Warten Sie einige Sekunden, und unser Patch-Tool wird ausgeführt, gefolgt vom Neustart der IDE. Erledigt!
Wenn Sie nicht möchten, dass die IDE den Patch installiert, können Sie ihn auch auf das Portal my.embarcadero.com herunterladen und manuell installieren. Wir empfehlen jedoch, die Installation innerhalb der IDE durchzuführen. Es ist viel einfacher und nach der Installation erkennt die IDE, dass sie installiert ist, und fordert Sie nicht mehr auf.
Beachten Sie die von Clang erstellten Komponenten und Ereignishandler
Hinweis: Komponenten, die mit dem Clang-basierten Compiler erstellt wurden, haben auch Probleme beim Generieren von Ereignishandlern. Wir empfehlen derzeit, dass jede C ++ – Komponente, die für die Verwendung zur Entwurfszeit vorgesehen ist, mit dem klassischen Compiler erstellt wird. Dies ist sowohl das Design- als auch das Laufzeitpaket. Jede Komponente, die nicht für die Verwendung im Formular-Designer vorgesehen ist, kann mit dem Clang-Compiler erstellt werden.
Wir planen, dieses Problem zu beheben – Clang sollte in jeder Hinsicht ein vollständiger Ersatz für Classic sein. (In 10.4 wurde beispielsweise ein neuer Debugger eingeführt, der sicherstellt, dass dieser besser als der klassische ist.)
Mon Oct 05 2020 22:24:40 GMT+0700 (Western Indonesia Time)
Seit der Einführung des GetIt Package Managers in RAD Studio XE8 konzentriert sich Embarcadero darauf, es zu einem großartigen Tool für die Verteilung zusätzlicher Bibliotheken, Komponenten, Tools, Beispiele, Demoprojekte, Stile und mehr an RAD Studio-Kunden zu machen. Wir verwenden es, um Embarcadero-Add-Ons, aber auch Open Source-Bibliotheken und kostenlose Angebote von Drittanbietern sowie Testversionen kostenpflichtiger Komponenten zu vertreiben. Die GetIt-Engine wird auch zur Produktinstallation und zur Bereitstellung von Patches verwendet.
Bis vor kurzem war es nur in der RAD Studio IDE selbst möglich, GetIt-Pakete und -Kategorien zu entdecken und zu navigieren sowie mehr über den gesamten GetIt-Inhaltskatalog zu erfahren.
Wir freuen uns , Ihnen eine neue öffentlich zugängliche Website mit dem Namen https://getitnow.embarcadero.com vorstellen zu können, auf der der GetIt-Inhalt für die neueste RAD Studio-Version aufgelistet ist und die es Benutzern ermöglicht, problemlos in denselben Kategorien zu navigieren und nach Produkt und Anbieter zu filtern. Diese neue Website fragt den GetIt-Server ab, um sicherzustellen, dass der Inhalt im Laufe der Zeit ausgerichtet bleibt.
Die GetItNow-Site
Wenn Sie https://getitnow.embarcadero.com/ öffnen , wird im Dialogfeld GetIt Package Manager eine Liste angezeigt, die der Darstellung von RAD Studio ähnelt.
Standardmäßig listet die Site alle Pakete nach Datum sortiert auf, wobei die zuletzt erstellten oder geänderten Komponenten zuerst angezeigt werden. Im obigen Screenshot sehen Sie die Komponenten nach Namen sortiert.
Das seitliche Navigationsfeld bietet auch die Möglichkeit, nach unterstützten Produkten, nach Update-Abonnements und nach Kategorien zu filtern. Es gibt auch ein Suchfeld, in dem Sie nach Paketnamen suchen können. Beim Öffnen einer Komponente wird eine Detailansicht mit weiteren Informationen angezeigt, einschließlich Lizenzdetails
Beachten Sie, dass das Bild auf der Seite nur ein Platzhalter ist und dass die angezeigten Informationen nicht den Hinweis enthalten, ob das Paket in allen SKUs oder nur in den Enterprise- und Architect-SKUs verfügbar ist. Am Ende der Seite sehen Sie zusätzliche Pakete von denselben Anbietern und verwandten Paketen (in diesem Fall zeige ich Informationen zum Alien Invasion-Spiel an):
Die Seite für jede Komponente verfügt über eine eindeutige URL wie https://getitnow.embarcadero.com/AlienInvasion-1.11/, sodass Sie einen Link mit einem anderen Entwickler oder in sozialen Medien teilen können. Wir haben einige zusätzliche Anstrengungen unternommen, um sicherzustellen, dass beim Verknüpfen mit den Seiten in sozialen Medien auf der Website eine schöne Vorschau angezeigt wird. Verwenden Sie dazu die Share- Links für Twitter und Facebook auf der Paketseite.
Seitennavigation
Die Site verfügt über zusätzliche Navigationsoptionen, die Sie über die Hauptmenüelemente im oberen Banner erreichen können:
Wir freuen uns über den Wert, den der Start der GetIt Portal-Website für unsere Kunden bietet. Es erleichtert das Durchsuchen von GetIt-Inhalten und das Teilen mit anderen Entwicklern und ermöglicht es uns, alle großartigen Pakete aus unserem Drittanbieter-Ökosystem hervorzuheben, die in GetIt verfügbar sind. Wir haben Pläne, die Website in Zukunft zu erweitern, und freuen uns über Ihr Feedback.
Mon Oct 05 2020 19:42:27 GMT+0700 (Western Indonesia Time)
Desde que introdujo GetIt Package Manager en RAD Studio XE8, Embarcadero se ha centrado en convertirlo en una gran herramienta para distribuir bibliotecas, componentes, herramientas, muestras, proyectos de demostración, estilos y más para los clientes de RAD Studio. Lo usamos para distribuir complementos de Embarcadero, pero también bibliotecas de código abierto de terceros y ofertas gratuitas, y versiones de prueba de componentes pagos. El motor GetIt también se usa para la instalación de productos y para entregar parches.
Hasta hace poco, descubrir y navegar por los paquetes y categorías de GetIt y aprender más sobre todo el catálogo de contenido de GetIt solo era posible desde el propio IDE de RAD Studio.
Nos complace anunciar un nuevo sitio web público, https://getitnow.embarcadero.com, que enumera el contenido de GetIt para la última versión de RAD Studio y permite a los usuarios navegar fácilmente por las mismas categorías y filtrar por producto y proveedor. Este nuevo sitio web consulta el servidor GetIt para asegurarse de que el contenido permanezca alineado a lo largo del tiempo.
El sitio GetItNow
Al abrir https://getitnow.embarcadero.com/, verá una lista similar a la que presenta RAD Studio en el cuadro de diálogo GetIt Package Manager.
De forma predeterminada, el sitio enumera todos los paquetes, ordenados por fecha, mostrando primero los componentes creados o modificados más recientes. En la captura de pantalla anterior, verá los componentes ordenados por nombre.
El panel de navegación lateral también ofrece la posibilidad de filtrar por producto compatible, suscripción de actualización y categoría. También hay un campo de búsqueda que le permite buscar por nombre de paquete. Al abrir un componente, verá una vista detallada con más información, incluidos los detalles de la licencia:
Tenga en cuenta que la imagen del lateral es solo un marcador de posición y que la información que se muestra no incluye la indicación de si el paquete está disponible en todos los SKU o solo en los de Enterprise y Architect. En la parte inferior de la página, puede ver paquetes adicionales de los mismos proveedores y paquetes relacionados (en estos casos, estoy mostrando información para el juego Alien Invasion):
La página de cada componente tiene una URL única, como https://getitnow.embarcadero.com/AlienInvasion-1.11/ para que pueda compartir un enlace con otro desarrollador o en las redes sociales. Hemos hecho un esfuerzo adicional para asegurarnos de que cuando se vincula a las páginas de las redes sociales, el sitio muestra una vista previa agradable. Para lograr esto, use los enlaces Compartir para Twitter y Facebook en la página del paquete.
sitio de navegacion
El sitio tiene opciones de navegación adicionales a las que puede acceder utilizando los elementos del menú principal en el banner superior:
Estamos entusiasmados con el valor que el lanzamiento del sitio web GetIt Portal ofrece a nuestros clientes. Hace que sea más fácil navegar por el contenido de GetIt y compartirlo con otros desarrolladores, y también nos permite destacar todos los excelentes paquetes de nuestro ecosistema de terceros que están disponibles en GetIt. Tenemos planes para ampliar el sitio en el futuro y agradecemos sus comentarios.
Mon Oct 05 2020 19:41:47 GMT+0700 (Western Indonesia Time)
Desde a introdução do GetIt Package Manager no RAD Studio XE8, a Embarcadero tem se concentrado em torná-lo uma ótima ferramenta para distribuir bibliotecas adicionais, componentes, ferramentas, amostras, projetos de demonstração, estilos e muito mais para clientes RAD Studio. Nós o usamos para distribuir complementos do Embarcadero, mas também bibliotecas de código aberto de terceiros e ofertas gratuitas e versões de teste de componentes pagos. O mecanismo GetIt também é usado para instalação de produtos e para entrega de patches.
Até recentemente, descobrir e navegar pelos pacotes e categorias GetIt e aprender mais sobre todo o catálogo de conteúdo GetIt só era possível a partir do próprio IDE RAD Studio.
Temos o prazer de anunciar um novo site voltado ao público, https://getitnow.embarcadero.com, que lista o conteúdo GetIt para a versão mais recente do RAD Studio e permite aos usuários navegar facilmente nas mesmas categorias e filtrar por produto e fornecedor. Este novo site consulta o servidor GetIt para se certificar de que o conteúdo permanece alinhado ao longo do tempo.
O site GetItNow
Ao abrir https://getitnow.embarcadero.com/, você verá uma lista semelhante à que o RAD Studio apresenta na caixa de diálogo Gerenciador de pacotes GetIt.
Por padrão, o site lista todos os pacotes, classificados por data, com os componentes mais recentes criados ou modificados sendo exibidos primeiro. Na captura de tela acima, você vê os componentes classificados por nome.
O painel de navegação lateral também oferece a capacidade de filtrar por produto compatível, por assinatura de atualização e por categoria. Há também um campo de pesquisa, permitindo pesquisar por nome de pacote. Ao abrir um componente, você vê uma visão detalhada com mais informações, incluindo detalhes da licença:
Observe que a imagem ao lado é apenas um espaço reservado, e que as informações exibidas não incluem a indicação se o pacote está disponível em todos os SKUs, ou apenas nos Enterprise e Architect. Na parte inferior da página, você pode ver pacotes adicionais dos mesmos fornecedores e pacotes relacionados (neste caso, estou mostrando informações para o jogo Alien Invasion):
A página de cada componente tem um URL exclusivo, como https://getitnow.embarcadero.com/AlienInvasion-1.11/ para que você possa compartilhar um link com outro desenvolvedor ou nas redes sociais. Fizemos um esforço extra para garantir que, quando você criar um link para as páginas nas redes sociais, o site exiba uma boa visualização. Para fazer isso, use os links de compartilhamento para Twitter e Facebook na página do pacote.
Navegação no site
O site tem opções de navegação adicionais que você pode alcançar usando os itens do menu principal no banner superior:
Estamos entusiasmados com o valor que o lançamento do site do Portal GetIt oferece aos nossos clientes. Isso torna mais fácil navegar pelo conteúdo GetIt e compartilhá-lo com outros desenvolvedores, e também nos permite destacar todos os grandes pacotes de nosso ecossistema de terceiros que estão disponíveis no GetIt. Temos planos para estender o site no futuro e agradecemos seus comentários.
Mon Oct 05 2020 19:41:20 GMT+0700 (Western Indonesia Time)
С момента появления GetIt Package Manager в RAD Studio XE8 Embarcadero сосредоточился на том, чтобы сделать его отличным инструментом для распространения дополнительных библиотек, компонентов, инструментов, образцов, демонстрационных проектов, стилей и многого другого для клиентов RAD Studio. Мы используем его для распространения надстроек Embarcadero, а также сторонних библиотек с открытым исходным кодом и бесплатных предложений, а также пробных версий платных компонентов. Механизм GetIt также используется для установки продуктов и доставки исправлений.
До недавнего времени находить и перемещаться по пакетам и категориям GetIt, а также узнавать больше обо всем каталоге контента GetIt можно было только в самой среде RAD Studio IDE.
Мы рады объявить о новом общедоступном веб-сайте https://getitnow.embarcadero.com, на котором перечислены материалы GetIt для последней версии RAD Studio, которые позволяют пользователям легко перемещаться по тем же категориям и фильтровать по продукту и поставщику. Этот новый веб-сайт запрашивает сервер GetIt, чтобы убедиться, что контент со временем остается выровненным.
Сайт GetItNow
Открыв https://getitnow.embarcadero.com/, вы увидите список, аналогичный тому, что RAD Studio представляет в диалоговом окне GetIt Package Manager.
По умолчанию на сайте перечислены все пакеты, отсортированные по дате, причем первыми отображаются последние созданные или измененные компоненты. На скриншоте выше вы видите компоненты, отсортированные по имени.
Боковая панель навигации также предлагает возможность фильтрации по поддерживаемым продуктам, по подписке на обновления и по категории. Также есть поле поиска, позволяющее искать по имени пакета. Когда вы открываете компонент, вы видите подробный вид с дополнительной информацией, включая сведения о лицензии:
Обратите внимание, что изображение сбоку — это просто заполнитель, и что отображаемая информация не включает указание, доступен ли пакет во всех SKU или только в Enterprise и Architect. Внизу страницы вы можете увидеть дополнительные пакеты от тех же поставщиков и связанные пакеты (в этом случае я показываю информацию для игры Alien Invasion):
Страница для каждого компонента имеет уникальный URL-адрес, например https://getitnow.embarcadero.com/AlienInvasion-1.11/, чтобы вы могли поделиться ссылкой с другим разработчиком или в социальных сетях. Мы приложили дополнительные усилия, чтобы при переходе по ссылкам на страницы в социальных сетях сайт отображал красивый предварительный просмотр. Для этого используйте ссылки «Поделиться» для Twitter и Facebook на странице пакета.
Навигация по сайту
На сайте есть дополнительные возможности навигации, к которым вы можете перейти, используя пункты главного меню в верхнем баннере:
Мы очень рады тому, какую ценность представляет запуск веб-сайта GetIt Portal для наших клиентов. Это упрощает просмотр содержимого GetIt и обмен им с другими разработчиками, а также позволяет нам выделить все отличные пакеты из нашей сторонней экосистемы, доступные в GetIt. У нас есть планы по расширению сайта в будущем, и мы будем рады вашим отзывам.
Mon Oct 05 2020 15:41:21 GMT+0700 (Western Indonesia Time)
Acabamos de lanzar un parche para C ++ Builder 10.4.1 que afecta el uso de componentes escritos en C ++ en el diseñador de formularios. Este parche soluciona el siguiente problema:
Los controladores de eventos no siempre se generaron en el IDE con una firma de método compatible con el tipo de controlador de eventos (RSP-29734)
Cuando se usa un componente compilado con el compilador clásico en el diseñador de formularios del IDE, la generación de un controlador de eventos dentro del IDE (como al hacer doble clic en una entrada del controlador de eventos en el Inspector de objetos) a menudo crea un método con una firma incompatible con el evento, provocando un error “La propiedad y el método no son compatibles”. Esto se corrige en esta revisión.
Debería reconstruir sus paquetes de componentes de C ++ (diseño y tiempo de ejecución) después de instalar esta revisión u obtener una versión actualizada de su proveedor de componentes.
Instalación del parche
El IDE puede instalar automáticamente el parche. Cuando abra RAD Studio o C ++ Builder, verá una nota en la pantalla de bienvenida que indica que hay una actualización disponible. Al hacer clic en esto, se abrirá GetIt. También puede abrir GetIt a través del menú Herramientas> elemento de menú Administrador de paquetes GetIt y buscar la categoría ‘Parches y revisiones’.
Debido a que este parche sobrescribe los archivos que el IDE ha cargado, cerrará el IDE antes de instalarlo. Esta es la primera vez que lanzamos un parche que instala el IDE que modifica los archivos que el propio IDE está usando, y es parte de nuestra revisión de la distribución del parche que comenzó en 10.4. ¡Es una gran tecnología!
El IDE se cerrará y verá que se abren algunas ventanas de línea de comandos. Esté atento a un mensaje de elevación de permisos parpadeante en la barra de tareas, ya que el instalador necesita permisos elevados para instalar archivos en su carpeta Archivos de programa
Espere unos segundos y verá que nuestra herramienta de parche se ejecuta, seguida del reinicio del IDE. ¡Hecho!
Si no desea que el IDE instale el parche, también puede descargarlo en el portal my.embarcadero.com e instalarlo manualmente. Pero recomendamos instalar desde el IDE; es mucho más fácil y, una vez instalado, el IDE sabrá que está instalado y ya no le preguntará.
Nota sobre los controladores de eventos y los componentes creados por Clang
Nota: los componentes creados con el compilador basado en Clang también tienen problemas para generar controladores de eventos; actualmente recomendamos que cualquier componente de C ++ que esté diseñado para su uso en tiempo de diseño se compile con el compilador clásico. Estos son los paquetes designtime y runtime. Cualquier componente que no esté destinado a ser utilizado en el diseñador de formularios se puede construir con el compilador de Clang.
Planeamos resolver esto: Clang debería ser un reemplazo completo de Classic en todos los sentidos. (Por ejemplo, 10.4 introdujo un nuevo depurador, lo que garantiza que sea mejor que el clásico).
Mon Oct 05 2020 01:29:50 GMT+0700 (Western Indonesia Time)
Acabamos de lançar um patch para C ++ Builder 10.4.1 que afeta o uso de componentes escritos em C ++ no designer de formulário. Este patch aborda o seguinte problema:
Os manipuladores de eventos nem sempre foram gerados no IDE com uma assinatura de método compatível com o tipo de manipulador de eventos (RSP-29734)
Ao usar um componente compilado com o compilador clássico no designer de formulário do IDE, a geração de um manipulador de eventos dentro do IDE (como clicar duas vezes em uma entrada do manipulador de eventos no Inspetor de objetos) geralmente cria um método com uma assinatura incompatível com o evento, causando um erro “A propriedade e o método não são compatíveis”. Isso foi corrigido neste hotfix.
Você deve reconstruir seus pacotes de componentes C ++ (design e tempo de execução) após instalar esse hotfix ou obter uma versão atualizada do fornecedor do componente.
Instalando o Patch
O patch pode ser instalado automaticamente pelo IDE. Ao abrir o RAD Studio ou C ++ Builder, você verá uma observação na tela de boas-vindas informando que uma atualização está disponível. Clicar aqui abrirá GetIt. Você também pode abrir o GetIt através do menu Ferramentas> item de menu Gerenciador de pacotes GetIt e procurar a categoria ‘Patches e hotfixes’.
Como esse patch sobrescreve os arquivos que o IDE carregou, ele fechará o IDE antes da instalação. Esta é a primeira vez que lançamos um patch que o IDE instala que modifica os arquivos que o próprio IDE está usando, e é parte de nossa revisão da distribuição do patch iniciada na versão 10.4. É uma ótima tecnologia!
O IDE será fechado e você verá algumas janelas de linha de comando sendo abertas. Fique de olho no prompt de elevação de permissões piscando na barra de tarefas, uma vez que o instalador precisa de permissões elevadas para instalar arquivos na pasta Arquivos de programas.
Aguarde alguns segundos e você verá nossa ferramenta de patch em execução, seguida da reinicialização do IDE. Feito!
Se não quiser permitir que o IDE instale o patch, você também pode baixá-lo no portal my.embarcadero.com e instalá-lo manualmente. Mas recomendamos instalar de dentro do IDE; é muito mais fácil e, depois de instalado, o IDE saberá que está instalado e não solicitará mais.
Observe os componentes e manipuladores de eventos criados pelo Clang
Nota: componentes construídos usando o compilador baseado em Clang também têm problemas ao gerar manipuladores de eventos; atualmente recomendamos que qualquer componente C ++ destinado ao uso em tempo de design seja construído com o compilador clássico. Estes são os pacotes de tempo de design e tempo de execução. Qualquer componente não destinado a ser usado no designer de formulário pode ser construído com o compilador Clang.
Planejamos resolver isso – o Clang deve ser um substituto completo do Classic em todos os sentidos. (Por exemplo, 10.4 introduziu um novo depurador, garantindo que seja melhor do que o clássico.)
Mon Oct 05 2020 01:29:12 GMT+0700 (Western Indonesia Time)
Мы только что выпустили патч для C ++ Builder 10.4.1, который влияет на использование компонентов, написанных на C ++, в конструкторе форм. Этот патч устраняет следующую проблему:
Обработчики событий не всегда создавались в среде IDE с совместимой сигнатурой метода для типа обработчика событий (RSP-29734)
При использовании компонента, скомпилированного с помощью классического компилятора в конструкторе форм IDE, создание обработчика событий внутри IDE (например, путем двойного щелчка по записи обработчика событий в инспекторе объектов) часто создает метод с сигнатурой, несовместимой с событием, вызывает ошибку «Свойство и метод несовместимы». Это исправлено в этом исправлении.
После установки этого исправления необходимо перестроить пакеты компонентов C ++ (во время разработки и выполнения) или получить обновленную версию у поставщика компонентов.
Установка патча
Патч может быть автоматически установлен IDE. Когда вы откроете RAD Studio или C ++ Builder, вы увидите на экране приветствия примечание о наличии обновления. При нажатии откроется GetIt. Вы также можете открыть GetIt через меню «Инструменты»> «Диспетчер пакетов GetIt» и найти категорию «Патчи и исправления».
Поскольку этот патч перезаписывает файлы, загруженные IDE, он закроет IDE перед установкой. Это первый раз, когда мы выпустили исправление, устанавливаемое IDE, которое изменяет файлы, используемые самой IDE, и является частью нашего капитального ремонта распространения исправлений, начатого в 10.4. Это отличная технология!
IDE закроется, и вы увидите, как открываются некоторые окна командной строки. Следите за мигающим запросом повышения разрешений на панели задач, так как установщику требуются повышенные разрешения для установки файлов в папку Program Files.
Подождите несколько секунд, и вы увидите, что наш инструмент исправлений работает, а затем перезапускается среда IDE. Выполнено!
Если вы не хотите, чтобы среда IDE устанавливала исправление, вы также можете загрузить его на портале my.embarcadero.com и установить вручную. Но мы рекомендуем устанавливать из среды IDE; это намного проще, и после установки IDE будет знать, что она установлена, и больше не будет запрашивать вас.
Обратите внимание на компоненты и обработчики событий, созданные в Clang.
Примечание. Компоненты, созданные с использованием компилятора на основе Clang, также имеют проблемы с созданием обработчиков событий; в настоящее время мы рекомендуем, чтобы любой компонент C ++, предназначенный для использования во время разработки, был построен с использованием классического компилятора. Это пакеты как среды разработки, так и среды выполнения. Любой компонент, не предназначенный для использования в конструкторе форм, может быть построен с помощью компилятора Clang.
Мы планируем решить эту проблему — Clang должен стать полноценной заменой Classic во всех отношениях. (Например, 10.4 представил новый отладчик, гарантирующий, что он лучше, чем классический.)
Sun Oct 04 2020 13:04:02 GMT+0700 (Western Indonesia Time)
One of the most shown feature of Delphi is its Design Editor with its ability to design forms and connect components in an easy and intuitive way. I can’t count the occasions where I have seen a form being decorated with some data controls connected to a TDatasource, which itself is connected to a TDataset descendant (see the docwiki).
Often these controls are placed on the form, but that approach is usually not recommended. While the data controls must reside on the form and the data source(s) should better be on the form, too (I will explain later why), the TDataSet descendants are better placed on a separate data module. This allows the separation of the data logic from the UI and (hopefully) encourages reuse.
This simple example has two data modules and two forms:
The data module TDbConnectDM contains the connection component and the wait cursor component required by FireDAC.
The second data module TMainDM has the dataset, a TFDQuery with its static fields, and an action with its action list. The query is connected to the TFDConnection from DBConnectDM.
The form TMainForm introduces a data source connected to the query from MainDM and a TDBGrid and TDBNavigator connected to the data source. A simple TButton to open an instance of the second form (TEditForm) completes the controls on this form.
The remaining form TEditForm also has a data source connected to the query from MainDM, a couple of TDBEdit controls connected to the data source and configured for the different fields of the query and a TButton connected to the action of MainDM.
The real magic happens during runtime where all these connections are re-established when the forms and data modules are instantiated.
The connections between all these components are responsible for the lack of actual code to write. The only code in all data modules and forms is this:
procedure TMainDM.Action1Execute(Sender: TObject);
begin
tblData.Post;
end;
procedure TMainDM.Action1Update(Sender: TObject);
begin
Action1.Caption := 'Save ' + tblDataEMP_NO.AsString;
end;
procedure TMainForm.btnEditClick(Sender: TObject);
var
instance: TEditForm;
begin
instance := TEditForm.Create(nil);
try
instance.ShowModal;
finally
instance.Free;
end;
end;
Not sure about you, but selecting a record, clicking Edit Record, closing the dialog before selecting the next record seems not very comfortable to me. Let’s change from a modal Edit window to a non-modal one working always on the current record.
Turns out that is even a bit simpler: We add the Edit Form to the auto-create forms of the application and reduce the button click event to simply show that form:
procedure TMainForm.btnEditClick(Sender: TObject);
begin
EditForm.Show;
end;
So what? Nothing new here up to now. I guess, most of you have written similar applications since ages. OK, let’s get a bit mean now.
What about having multiple edit forms open simultaneously , each with a different record?
From a users perspective this might look like a small extension of the program, but as developers we know that a dataset can have only one current record. If each edit form has to work on its own record, we need a separate dataset for each edit form.
Before someone suggests to place the dataset back into the form: No, we don’t want that! In a real world scenario there may be more datasets with complex interactions and business rules to follow. Things never are as simple as shown in a demo.
This seems also a good place to explain the TDataSource should stay in the form rule mentioned in the beginning.
The official one is: One can easily change the dataset in the data source of an individual form instance without interferring with others also using a datasource in a datamodule.
The unofficial one is: Sometimes the IDE looses these connections, f.i. when the data module cannot be opened. In that case it is easier to re-connect the dataset of one data source on the form instead the data sources of several data controls.
A valid approach is to create a new instance of the data module for each form instance and let the form components use that one. For that we declare a new property in the Edit Form of type TMainDM and create an instance in the forms constructor.
We remove the Edit Form from the auto-create forms and create a new instance in the button click event – just like before, but non-modal.
procedure TMainForm.btnEditClick(Sender: TObject);
var
instance: TEditForm;
begin
instance := TEditForm.Create(Self);
instance.Show;
end;
Each instance is owned by the main form, so they will be freed when the main form is destroyed.
Let’s see if that is sufficient.
Not quite! Although we have separate Edit forms, each with its own local data module instance, the current record still follows the dataset of the main form. Why is that?
It’s that magic we saw before, that re-connects the controls at runtime in the same way as we specified in the Designer. For some reason this magic prefers the auto-created instance of the MainDM data module over the local ones in the Edit Form.
So let’s have a quick look at the internals behind this magic.
Peeking in the DFM we see the connection from the data source to the dataset looks like this:
object dsData: TDataSource
DataSet = MainDM.tblData
Left = 180
Top = 16
end
The target of this connection is simply the qualified name of the tblData component in the MainDM data module. So the connections are somehow resolved by the components names.
But wait, the local TMainDM instances are also named MainDM. Why are they just ignored when it comes to finding the MainDM instance to connect the dataset?
The relevant code is located in the method TReader.DoFixupReferences found in System.Classes:
aPropFixup := TPropFixup(FFixups[I]);
CompName := aPropFixup.FName;
ReferenceName(CompName);
Reference := FindNestedComponent(aPropFixup.FInstanceRoot, CompName);
if (Reference = nil) and Assigned(FOnFindComponentInstance) then
FOnFindComponentInstance(Self, CompName, Reference);
The interesting find is that the reader first tries to find a component inside the root component of the reference to resolve (i.e. TEditForm): FindNestedComponent. Only when no suitable component is found, it asks for the help of FOnFindComponentInstance.
But when nested components are preferred, our local instance of TMainDM should be found first, shouldn’t it? Inspecting the code for FindNestedComponent reveals that it actually uses FindComponent inside the Edit Form to access the TMainDM instance. There are two reasons for not finding it:
The instance is not created yet
The instance has another name as we expect
We can rule out the first one as we create the instance before we call inherited inside the constructor. That puts the blame on the second one.
We can find a hint in TReader.ReadRootComponent, where a call to FindUniqueName is responsible for the name change of our local TMainDM instances. As we are not able to change the reader code (at least not willing to do so – although there are ways), we just have to cope with this name change of our local data module instances.
How can we do that? As often there is more than one way.
The easiest one is to simply rename the instance back to its original name. Unless your application relies on unique names for these data modules there should be no harm with this approach.
procedure ResetComponentName(AComponent: TComponent);
begin
AComponent.Name := AComponent.ClassName.Substring(1);
end;
constructor TEditForm.Create(AOwner: TComponent);
begin
FDataModule := TMainDM.Create(Self);
ResetComponentName(FDataModule);
inherited;
end;
We also have to synchronize the dataset in the local data module with the current record in the Main Form (We should have done that before, but it wouldn’t have helped either).
procedure TMainForm.btnEditClick(Sender: TObject);
var
instance: TEditForm;
begin
instance := TEditForm.Create(Self);
instance.DataModule.SyncRecord(MainDM);
instance.Show;
end;
procedure TMainDM.SyncRecord(Source: TMainDM);
begin
if Source = Self then Exit;
tblData.Locate(tblDataEMP_NO.FieldName, Source.tblDataEMP_NO.Value);
end;
Looks much better now, doesn’t it? And we even haven’t added much new code to make it work.
In case you cannot live with the non-unique naming of the local TMainDM instances (they all appear in the Screen.DataModules list), there is another approach: Change all the references to use the new name of the data module. Unfortunately this requires a bit more coding.
The TReader offers an event OnReferenceName, which is called directly before the FindNestedComponent call in DoFixupReferences. If we could connect a handler to this event, we could change the reference in a suitable way. So how can we get hands on the TReader instance to wire that event?
In their infinite wisdom the creators of the Delphi component architecture gave us the virtual ReadState method with the current TReader as a parameter. So we override the ReadState in TEditForm and inject our event handler.
private
FDataModule: TMainDM;
FOnReferenceName: TReferenceNameEvent;
protected
procedure AdjustReference(var Value: string; AComponent: TComponent);
procedure MyReferenceName(Reader: TReader; var Name: string);
procedure ReadState(Reader: TReader); override;
public
constructor Create(AOwner: TComponent); override;
property DataModule: TMainDM read FDataModule;
end;
procedure TEditForm.AdjustReference(var Value: string; AComponent: TComponent);
var
fromName: string;
toName: string;
begin
fromName := AComponent.ClassName.Substring(1); // Remove T
toName := AComponent.Name;
if Value = fromName then
Value := toName
else if Value.StartsWith(fromName + '.') then
Value := Value.Remove(0, fromName.Length).Insert(0, toName);
end;
procedure TEditForm.MyReferenceName(Reader: TReader; var Name: string);
begin
AdjustReference(Name, DataModule);
if Assigned(FOnReferenceName) then
FOnReferenceName(Reader, Name);
end;
procedure TEditForm.ReadState(Reader: TReader);
begin
FOnReferenceName := Reader.OnReferenceName;
try
Reader.OnReferenceName := MyReferenceName;
inherited;
finally
Reader.OnReferenceName := FOnReferenceName;
end;
end;
Compared to our previous experience that looks like quite a bit of code. For a real world scenario one should consider to place most of the code in a common ancestor class, make MyReferenceName virtual and simply override it in derived classes where necessary.
procedure MyReferenceName(Reader: TReader; var Name: string); virtual;
procedure TBaseForm.MyReferenceName(Reader: TReader; var Name: string);
begin
if Assigned(FOnReferenceName) then
FOnReferenceName(Reader, Name);
end;
procedure MyReferenceName(Reader: TReader; var Name: string); override;
procedure TEditForm.MyReferenceName(Reader: TReader; var Name: string);
begin
AdjustReference(Name, DataModule);
inherited;
end;
Finally, we found a way to use the Delphi Form Designer to connect components between forms, frames and data modules without loosing these connections for multiple, dynamically instantiated instances. A benefit of this approach is the minimal amount of code we have to write – and less code means less bugs and easier maintenance.
The sources to the program shown in this article can be downloaded here:
TweakingDFMLoading.zip.
You might have to change the database connection to something you have on your system. The sample code uses the employee.gdb database from the samples folder connected via a standard Interbase developer instance. If you use another database you probably have to change the data fields in the Edit Form.
Sat Oct 03 2020 22:25:22 GMT+0700 (Western Indonesia Time)
Wir organisieren DelphiCon WorldWide als Online-Delphi-Event für 2020. Dieses Event unterscheidet sich von CodeRage of Past, da DelphiCon sich auf Delphi konzentriert.
Drei Tage – Dienstag, 17. November bis Donnerstag, 19. November.
Täglich von 9 bis 13 Uhr CST
Nur eine Spur – keine Planungskonflikte mehr!
Eine Mischung aus Live-Panels und traditionellen Sessions mit Fragen und Antworten
Sat Oct 03 2020 19:10:42 GMT+0700 (Western Indonesia Time)
Мы организуем DelphiCon WorldWide как онлайн-мероприятие, посвященное Delphi, на 2020 год. Это мероприятие отличается от CodeRage прошлого, поскольку DelphiCon ориентирован на Delphi.
Три дня — вторник 17 ноября по четверг 19 ноября.
С 9:00 до 13:00 каждый день
Только один трек — никаких конфликтов расписания!
Сочетание живых панелей и традиционных сессий с вопросами и ответами
Sat Oct 03 2020 19:10:27 GMT+0700 (Western Indonesia Time)
Estamos organizando o DelphiCon WorldWide como um evento online focado no Delphi para 2020. Este evento é diferente do CodeRage do passado, pois o DelphiCon é focado no Delphi.
Três dias – terça-feira, 17 de novembro a quinta-feira, dia 19.
9h às 13h CST todos os dias
Apenas uma faixa – sem mais conflitos de agendamento!
Uma mistura de painéis ao vivo e sessões tradicionais com perguntas e respostas
Sat Oct 03 2020 19:09:16 GMT+0700 (Western Indonesia Time)
Estamos organizando DelphiCon WorldWide como un evento en línea centrado en Delphi para 2020. Este evento es diferente de CodeRage del pasado, ya que DelphiCon se centra en Delphi.
Tres días: martes 17 de noviembre al jueves 19 de noviembre.
De 9 a. M. A 1 p. M. CST todos los días
Solo una pista, ¡no más conflictos de programación!
Una mezcla de paneles en vivo y sesiones tradicionales con preguntas y respuestas
Fri Oct 02 2020 22:54:34 GMT+0700 (Western Indonesia Time)
Daten sind zu einem der wichtigsten Aspekte eines Unternehmens geworden. Da sich Datenbanken weiterentwickeln, um große (ger) Daten, hochverfügbare Webanwendungen und komplexere Ebenen der Geschäftslogik zu unterstützen, sind die Anwendungen, die die Benutzeroberfläche und die Geschäftslogik dieser Änderung darstellen, schwieriger geworden. Für viele Anwendungsentwickler schreiben wir nicht nur Anwendungscode. Wir verbringen viel Zeit damit, Abfragen zu entwickeln und zu bearbeiten, um die Anwendungsleistung und -qualität zu verbessern. Aus diesem Grund verwenden wir RAD Studio, um diese Anwendungen für eine effizientere Entwicklung und eine schnellere Markteinführung zu erstellen.
Während wir mit RAD Studio unsere Anwendungen entwickeln können, gibt es bestimmte Aspekte, die durch andere Tools verbessert werden können, z. B. beim Visualisieren von Daten und beim Erstellen oder Analysieren von Abfragen.
Aqua Data Studio ist eine Produktivitäts-IDE für alle, die mit Daten arbeiten. Unabhängig davon, ob Sie die Datenbank entwickeln und verwalten oder nur Abfragen erstellen und ausführen müssen, handelt es sich um eine benutzerfreundliche, funktionsreiche Datenbank-IDE, mit der Sie schnell und effizient arbeiten können, um Ihre Daten abzurufen.
Multi-OS und Multi-Plattform
Entwickler sind nicht mehr an die Arbeit mit einem einzelnen Betriebssystem oder einem Datenbankserver gebunden. Einer der Hauptvorteile von Aqua Data Studio ist die Möglichkeit, nicht nur eine Verbindung zu mehr als 35 verschiedenen Datenquellen herzustellen, einschließlich Excel-Tabellen, sondern auch, dass die Software unter Windows, Mac OS und sogar Linux installiert wird.
Einfach zu generierende und zu erstellende ER-Modelle
In vielen Fällen müssen wir nicht bei Null anfangen und neue erstellen oder sogar ein ER-Modell unserer Datenbanken erstellen. Für diejenigen, die Modelle generieren oder erstellen, ist es jedoch großartig, ein benutzerfreundliches Tool zu haben, mit dem Sie das vollständige Bild Ihrer Datenbank, der Objekte und der Verbindung der Beziehungen sehen können.
Planen Sie SQL-Aufgaben
Wiederholte SQL-Jobs können zeit- und ressourcenintensiv sein. Daher ist es wichtig, die Jobaktivität für Ihre Datenquellen auf einfache Weise zu planen und zu analysieren. Die Verwendung eines einfach zu konfigurierenden SQL-Schedulers kann das Ausführen von Skripten in Zukunft erheblich vereinfachen.
Abfragen visuell erstellen
SQL ist eine sehr leistungsfähige Sprache, aber das Erstellen komplexer Abfragen kann zeitaufwändig sein, insbesondere wenn Sie Unterabfragen, Verknüpfungen, datenbankspezifische SQL-Anweisungen oder langsam laufende Abfragen haben. Mit Query Builder können Sie Abfragen mit einer einfachen und benutzerfreundlichen Drag & Drop-Oberfläche erstellen und optimieren.
Erstellen Sie Visuals für beliebige Daten
Sie können Daten mit einer Drag & Drop-Oberfläche analysieren, die einfach zu verwenden ist. Sie können Ihre Abfrageergebnisse verwenden und in Arbeitsblätter ziehen, die ansprechende Visualisierungen Ihrer Daten erstellen, bevor Sie sie zu Dashboards hinzufügen. Ziehen Sie die Datendimensionen direkt in Ihr Leerzeichen, um Ihre Daten zu visualisieren und zu analysieren.
Klicken Sie hier, wenn Sie detailliertere Videos und Ressourcen zu Aqua Data Studio anzeigen möchten.
Aqua Data Studio bietet viele weitere Funktionen. Probieren Sie es aus. Wenn Sie ein RAD Studio Architect-Benutzer mit Update-Abonnement sind, haben Sie bereits Zugriff auf Aqua Data Studio. Wenn Sie nicht über die Architect Edition verfügen, können Sie eine 14-tägige Testversion von ADS herunterladen und einen Blick darauf werfen.
Fri Oct 02 2020 21:52:35 GMT+0700 (Western Indonesia Time)
Os dados tornaram-se um dos aspectos mais importantes para qualquer empresa. À medida que os bancos de dados evoluem para suportar dados grandes (ger), aplicativos da web altamente disponíveis e lidar com níveis mais complexos de lógica de negócios, os aplicativos que representam a interface do usuário e a lógica de negócios dessa mudança se tornaram mais desafiadores. Para muitos desenvolvedores de aplicativos, não apenas escrevemos o código do aplicativo. Gastamos uma quantidade razoável de tempo desenvolvendo e manipulando consultas para aumentar o desempenho e a qualidade do aplicativo. É por isso que usamos o RAD Studio para construir esses aplicativos para um desenvolvimento mais eficiente e um tempo de entrada no mercado mais rápido.
Embora o RAD Studio nos permita desenvolver nossos aplicativos, existem certos aspectos que podem ser aprimorados por outras ferramentas, como ao visualizar dados e construir ou analisar consultas.
O Aqua Data Studio é um IDE de produtividade para qualquer pessoa que trabalhe com dados. Quer você desenvolva e gerencie o banco de dados ou apenas precise construir e executar consultas, é um IDE de banco de dados rico em recursos, fácil de usar, que permite trabalhar de forma rápida e eficiente para obter seus dados.
Multi-OS e Multi-Platform
Os desenvolvedores não estão mais presos a trabalhar com um único sistema operacional ou um servidor de banco de dados. Um dos principais benefícios do Aqua Data Studio é a capacidade não apenas de se conectar a mais de 35 fontes de dados diferentes, incluindo planilhas do Excel, mas também de instalar o software no Windows, Mac OS e até no Linux.
Em muitos casos, não temos que começar do zero e construir um novo ou mesmo gerar um modelo ER de nossos bancos de dados. Mas para aqueles que têm modelos de geração ou construção, é ótimo ter uma ferramenta fácil de usar que permite ver a imagem completa de seu banco de dados, os objetos e como os relacionamentos se interconectam.
Agendar Tarefas SQL
Jobs SQL repetitivos podem consumir tempo e recursos, portanto, é importante ter uma maneira fácil de agendar e analisar a atividade de job para suas fontes de dados. Usar um escalonador sql fácil de configurar pode ajudar a tornar a execução de scripts muito mais fácil no futuro.
Crie consultas visualmente
SQL é uma linguagem muito poderosa, mas formar consultas complexas pode ser demorado, especialmente quando você tem subconsultas, junções, instruções sql específicas de banco de dados ou consultas de execução lenta. O Query Builder permite construir e otimizar consultas com uma interface de arrastar e soltar simples e fácil de usar.
Crie recursos visuais de quaisquer dados
Você pode analisar dados com uma interface de arrastar e soltar que é fácil de usar. Você pode usar os resultados da consulta e colocá-los em planilhas que criam visualizações envolventes de seus dados antes de adicioná-los aos painéis. Arraste as dimensões de dados diretamente para o seu espaço em branco para começar a visualizar e analisar seus dados.
Clique aqui se quiser ver vídeos e recursos mais detalhados no Aqua Data Studio.
O Aqua Data Studio tem muitos outros recursos, então experimente. Se você é um usuário RAD Studio Architect com Assinatura de Atualização, você já tem acesso ao Aqua Data Studio. Se você não tem a edição Architect, pode baixar uma versão de avaliação de 14 dias do ADS e dar uma olhada.
Fri Oct 02 2020 21:52:15 GMT+0700 (Western Indonesia Time)
Данные стали одним из важнейших аспектов любой компании. По мере того, как базы данных развиваются для поддержки больших данных, высокодоступных веб-приложений и работы с более сложными уровнями бизнес-логики, приложения, которые представляют пользовательский интерфейс и бизнес-логику этого изменения, становятся все более сложными. Для многих разработчиков приложений мы не просто пишем код приложения. Мы тратим приличное количество времени на разработку и обработку запросов для повышения производительности и качества приложений. Вот почему мы используем RAD Studio для создания этих приложений для более эффективной разработки и более быстрого выхода на рынок.
Хотя RAD Studio позволяет нам разрабатывать наши приложения, есть определенные аспекты, которые можно улучшить с помощью других инструментов, например, при визуализации данных и построении или анализе запросов.
Aqua Data Studio — это продуктивная IDE для всех и каждого, кто работает с данными. Независимо от того, разрабатываете ли вы базу данных и управляете ею или вам просто нужно создавать и выполнять запросы, это простая в использовании многофункциональная среда IDE для баз данных, которая позволяет вам работать быстро и эффективно для получения данных.
Мульти-ОС и Мульти-платформенность
Разработчики больше не привязаны к работе с одной ОС или одним сервером базы данных. Одним из основных преимуществ Aqua Data Studio является возможность не только подключаться к более чем 35 различным источникам данных, включая электронные таблицы Excel, но также возможность установки программного обеспечения в Windows, Mac OS и даже Linux.
Во многих случаях нам не нужно начинать с нуля и создавать новую или даже создавать ER-модель наших баз данных. Но для тех, у кого есть создание или построение моделей, было бы здорово иметь простой в использовании инструмент, который позволяет вам увидеть полную картину вашей базы данных, объектов и того, как взаимосвязаны отношения.
Планирование задач SQL
Повторяющиеся задания SQL могут потребовать времени и ресурсов, поэтому важно иметь простой способ планирования и анализа активности заданий для ваших источников данных. Использование простого в настройке планировщика sql может значительно упростить выполнение сценариев в будущем.
Визуально строить запросы
SQL — очень мощный язык, но формирование сложных запросов может занять много времени, особенно если у вас есть подзапросы, объединения, SQL-запросы, специфичные для базы данных, или медленно выполняющиеся запросы. Конструктор запросов позволяет создавать и оптимизировать запросы с помощью простого и удобного интерфейса перетаскивания.
Создавайте визуальные эффекты любых данных
Вы можете анализировать данные с помощью простого в использовании интерфейса перетаскивания. Вы можете использовать результаты своего запроса и переносить их на рабочие листы, которые создают привлекательные визуализации ваших данных, прежде чем добавлять их на информационные панели. Перетащите измерения данных прямо в свободное пространство, чтобы начать визуализацию и анализ данных.
Щелкните здесь, если вы хотите увидеть более подробные видео и ресурсы по Aqua Data Studio.
Aqua Data Studio имеет гораздо больше возможностей, так что попробуйте. Если вы являетесь пользователем RAD Studio Architect с подпиской на обновления, у вас уже есть доступ к Aqua Data Studio. Если у вас нет версии Architect, вы можете загрузить 14-дневную пробную версию ADS и ознакомиться с ней.
Fri Oct 02 2020 21:50:54 GMT+0700 (Western Indonesia Time)
Los datos se han convertido en uno de los aspectos más importantes para cualquier empresa. A medida que las bases de datos evolucionan para admitir datos grandes (ger), aplicaciones web de alta disponibilidad y lidiar con niveles más complejos de lógica empresarial, las aplicaciones que representan la interfaz de usuario y la lógica empresarial de este cambio se han vuelto más desafiantes. Para muchos desarrolladores de aplicaciones, no solo escribimos código de aplicación. Dedicamos una buena cantidad de tiempo a desarrollar y manipular consultas para mejorar el rendimiento y la calidad de las aplicaciones. Es por eso que usamos RAD Studio para crear estas aplicaciones para un desarrollo más eficiente y un tiempo de comercialización más rápido.
Si bien RAD Studio nos permite desarrollar nuestras aplicaciones, existen ciertos aspectos que pueden mejorarse con otras herramientas, como al visualizar datos y construir o analizar consultas.
Aqua Data Studio es un IDE de productividad para cualquier persona que trabaje con datos. Ya sea que desarrolle y administre la base de datos o simplemente necesite construir y ejecutar consultas, es un IDE de base de datos rico en funciones fácil de usar que le permite trabajar de manera rápida y eficiente para obtener sus datos.
Multi-SO y multiplataforma
Los desarrolladores ya no están atados a trabajar con un solo sistema operativo o un servidor de base de datos. Uno de los principales beneficios de Aqua Data Studio es la capacidad no solo de conectarse a más de 35 fuentes de datos diferentes, incluidas hojas de cálculo de Excel, sino también de que el software se instalará en Windows, Mac OS e incluso Linux.
En muchos casos, no tenemos que empezar desde cero y crear un modelo nuevo o incluso generar un modelo ER de nuestras bases de datos. Pero para aquellos que sí tienen modelos para generar o construir, es genial tener una herramienta fácil de usar que les permita ver la imagen completa de su base de datos, los objetos y cómo se interconectan las relaciones.
Programar tareas de SQL
Los trabajos SQL repetitivos pueden consumir tiempo y recursos, por lo que es importante disponer de una forma sencilla de programar y analizar la actividad del trabajo para sus fuentes de datos. El uso de un programador sql fácil de configurar puede ayudar a que la ejecución de scripts en el futuro sea mucho más fácil.
Generar consultas visualmente
SQL es un lenguaje muy poderoso, pero la creación de consultas complejas puede llevar mucho tiempo, especialmente cuando tiene subconsultas, uniones, declaraciones SQL específicas de la base de datos o consultas de ejecución lenta. Query Builder le permite crear y optimizar consultas con una interfaz de arrastrar y soltar simple y fácil de usar.
Cree imágenes de cualquier dato
Puede analizar datos con una interfaz de arrastrar y soltar que es fácil de usar. Puede usar los resultados de su consulta y convertirlos en hojas de trabajo que crean visualizaciones atractivas de sus datos antes de agregarlos a los paneles. Arrastre dimensiones de datos directamente a su espacio en blanco para comenzar a visualizar y analizar sus datos.
Haga clic aquí si desea ver videos y recursos más detallados sobre Aqua Data Studio.
Aqua Data Studio tiene muchas más funciones, así que pruébelo. Si es un usuario de RAD Studio Architect con suscripción de actualización, ya tiene acceso a Aqua Data Studio. Si no tiene la edición Architect, puede descargar una versión de prueba de 14 días de ADS y echar un vistazo.
In Chrom ist es einfach, es herunterladen zu lassen, verwenden Sie die Dropdown-Taste
gut zu wissen
Ich sehe die Folien nicht in der Download-Zip
Sie sind ein PDF
Danke für den Download-Link!
Herzlich willkommen
Warum wird „Dieser Teil des Webinars kann auf Ihrem Gerät nicht angezeigt werden“ angezeigt.
Sehr komisch. Das tut mir leid. Ich bin mir nicht sicher, warum du das bekommen würdest. Ich werde Ihnen sicher einen Wiederholungslink per E-Mail senden.
Irgendein Problem?
Keine Probleme in dieser Hinsicht.
Hallo allerseits
Hallo
Ich habe noch nicht viel mit Python gemacht, aber Python ist auch im Windows Store verfügbar. Ein Klick installieren / deinstallieren kann nützlich sein.
Wahr.
Gutes Thema, ich bin beeindruckt
Ich lerne auch viel.
Wenn ich Python in einer Clientanwendung verwenden möchte – exe für Windows (10), muss dann Python auf dem Clientcomputer installiert sein?
Ja. Sie können Python entweder mit Ihrer Anwendung verteilen oder von ihnen zur Installation verlangen.
Beim Versuch, die Demos auszuführen, wurden viele Klassenfehler angezeigt, z. B. TSynEdit hat keine Fehlermeldungen gefunden. Mache ich etwas falsch?
TSynEdit ist in GetIt verfügbar. Sie müssen es zuerst installieren.
Funktioniert diese Integration in einer Isapi-DLL, die unter IIS ausgeführt wird?
Es sollte.
Hallo, ich möchte nach der Multithread-Anwendung fragen. Kann ich python.dll für jeden Delphi-Thread initialisieren und Code parallel ausführen?
Das wird in Teil 2 behandelt
Wie können wir SynEdit-Komponenten erhalten? Ist es Open Source?
Es ist Open Source und über den GetIt-Paketmanager in der IDE verfügbar oder kann hier heruntergeladen werden
Voraussetzung ist leider keine Option. Welche Python-Distribution kann ich in meine Anwendungsinstallation aufnehmen? Wie groß ist es? MB, GB? Vielen Dank
Holen Sie sich die 8 MB
Müssen die Endbenutzer Python auf dem Zielcomputer installiert haben?
Entweder muss der Endbenutzer es vorinstalliert haben, oder Sie können die Python-DLL mit Ihrer Anwendung verteilen.
Woher bekommt man diesen Synedit? Es ist nicht in Py4D enthalten, oder?
TSynEdit befindet sich im GetIt-Paketmanager in der IDE und ist hier verfügbar
Ist es möglich, Python-Skript in einem Thread auszuführen?
Ja, aber wir werden dies im nächsten Webinar ausführlicher behandeln.
Können Sie erklären, wie die Python-Komponenten installiert sind?
Ich werde detaillierte Installationsschritte hinzufügen und weitere Informationen hier
Guten Morgen..JS
Vielen Dank!
Wird die Wiederholung für diese Sitzung verfügbar sein?
Ja, Sie erhalten eine E-Mail mit der Wiederholung und ich werde die Wiederholung für beide Hälften und zusätzliche Ressourcen hier veröffentlichen
Es ist fantastisch!
einverstanden
Ich hoffe, dass eine Möglichkeit verfügbar ist, die in der exe kompilierte DLL als Ressource zu versenden und sie dann zur Laufzeit entweder in einen temporären Ordner zu extrahieren oder als in den Speicher extrahierte Ressource zu verwenden
Theoretisch könnte man das machen.
In der CAD-App Rhinoceros verwenden sie eine kurze Version von Phyton namens Iron Phyton für die Erstellung von Plugins. Ist es möglich, diese kurze Bibliothek mit Delphi zu mischen und ein Plugin mit Delphi zu erstellen?
Ja
für, in, import – Schlüsselwörter werden nicht hervorgehoben
Es war etwas falsch mit der Syntax-Hervorhebung dort. Genau das passiert mit Live-Demos.
Müssen wir in den Projektoptionen einen Pfad zu Python hinzufügen?
Es gibt einige Optionen für die Umverteilung.
Was passiert, wenn die Syntax falsch ist?
Es gibt Feedback zu Fehlern und Sie können dies in Ihrem Programm behandeln
1. Fügen Sie dem Link einen Link zu dieser einfachen Beispieldemo hinzu?
Gibt es eine Möglichkeit, verschiedene Python-Instanzen über eine Delphi-Anwendung zu verwalten, oder handelt es sich um eine Delphi-App mit nur einer Python-Instanz?
Sie können dies über die TPythonEngine verwalten
Kann ich es in einer Web-App verwenden?
In der Theorie. Sie haben einige zusätzliche Probleme mit Webanwendungen, daher müssten Sie mit Ihrem Threading-Modell vorsichtig sein, aber wenn Sie vorsichtig sind, sollte es gut funktionieren.
Was für ein guter Moderator ist er!
Ja
Funktioniert das auch mit C ++ Builder?
Die meisten Funktionen sollten mit C ++ Builder funktionieren.
hehe, ich denke Delphi würde die Schaffung von viel besseren visuellen Schnittstellen als tkinter ermöglichen
Oh ja, ich habe die Python-Optionen zum Erstellen der GUI untersucht und sie haben mich an die Erstellung der GUI vor Delphi erinnert. Delphi ist fantastisch darin, einer Python-Anwendung eine grafische Benutzeroberfläche hinzuzufügen.
Wie werden Python-Ausnahmen behandelt? Werden PyC erstellt, wenn das Skript ausgeführt wird? Wenn nein, dann ist die zweite Ausführung in Python schneller als in Delphi
Die Komponente fängt die Fehler ab und konvertiert sie in Delphi-Ausnahmen, die Sie behandeln können.
Ich muss einen Listener für Firebase implementieren. Ich konnte Python und Bibliothek installieren, aber ich konnte den Python-Code nicht laufen lassen
Haben Sie dieses Python-Timing mit kompiliertem Python-Code verglichen?
Kompiliertes Python wäre schneller als Demo, aber es gibt andere Leistungsverbesserungen über die parallele Bibliothek. Es gibt also immer Möglichkeiten, die Leistung zu verbessern.
Ich muss einen Listener für Firebase implementieren. Ich konnte Python und Bibliothek installieren, aber ich konnte den Python-Code nicht laufen lassen
Gibt es eine Einschränkung für importierte Python-Bibliotheken? Können wir zum Beispiel opencv, matplotlib, scipy, scikit importieren?
Ja, Sie können alle diese verwenden.
Möglicherweise habe ich Informationen zur „erforderlichen Verteilungsgröße“ verpasst, die in der Installation der Delphi-Anwendung für Endbenutzer enthalten sein könnten.
ungefähr 8 MB
Ist es möglich, Variablen von Delphi an Python zu übergeben?
Sehr beeindruckend! Wenn ich richtig gesehen habe, gibt es im Moment einige Einschränkungen für FreePascal / Lazarus bezüglich der Behandlung von Variantenänderungen.
Ja
Genau das ist mein Problem, die wenigen Optionen für Umverteilungen. Ich muss die Mindestgröße für den Endbenutzer finden.
Verwenden Sie die einbettbare Version und sie ist sehr klein
Woher weiß Python, wo das delphi_module erhältlich ist?
Für die heutigen Demos heißt es, aber im nächsten Webinar werden wir zeigen, wie Module für die Verwendung außerhalb von Delphi erstellt werden.
Kann ich Interaktionen mit Python aus Delphi 10.3.3 verwenden?
Ja
Es funktioniert auch mit Berlin?
Ja
Wird dieser Feed „Fragen“ später verfügbar sein? Hier gibt es einige gute Dinge.
Ja, ich werde sie mit der Wiederholung in den Blog-Beitrag aufnehmen
Kann ich Delphi-Objekte an Python übergeben und Objektmethoden in Python aufrufen?
Ja, eine Aufzeichnung wird in Kürze demonstriert, kann aber auch mit Objekt und Aufzeichnung durchgeführt werden.
Tolle
Einverstanden
Es wäre interessant zu sehen, wie Sie DLLs in Delphi erstellen können, die Sie aus reinem Python aufrufen. außerhalb von Delphi.
Ich glaube, das wird im 2. Teil in 2 Wochen behandelt.
??
Wann ist die nächste Sitzung?
in zwei Wochen gleichzeitig. Du bist bereits registriert
Ist es Multithreading-fähig?
Ja
Wie kann ich dem System mitteilen, in welchem Pfad sich diese Bibliotheken befinden, wenn ich die Python-DLLs und einige Bibliotheken zusammen mit meiner Anwendung in einem Unterverzeichnis verteilen möchte?
Ja, über TPythonEngine
Ich bin wirklich beeindruckt von dem Sprecher und der Art und Weise, wie er den Bildschirm manipulieren kann, indem er hineinzoomt und auf die nächste Seite faltet. Wie macht er das bitte?
Es wäre interessant, die Ausgabe für das Delphi-Objekt zu sehen. Ref: print (Typ (Ref)) print (dir (Ref)) print (Hilfe (Ref))
Sie sind Python-Typen
Der Vergleich von Python mit Delphi-Ausführungszeiten ist für Leute, die diese TensorFlow-, Anaconda-, Panda- und Python-Bibliotheken benötigen, sehr umständlich. Benötige ich wirklich Delphi?
Delphi macht es einfach, die GUI zu erstellen und dann Ingot-TensorFlow-Python-Bibliotheken usw. aufzurufen. Delphi macht es einfach, die GUI zu erstellen und dann Ingot-TensorFlow-Python-Bibliotheken usw. aufzurufen.
wirklich schön und einfach zu bedienen
Wirklich tolles Zeug!
einverstanden
Wird die Aufzeichnung dieser Sitzung frei zugänglich sein?
Hallo! Ermöglicht Ihnen diese Bibliothek (Python4Delphi) das nahtlose Verknüpfen und Verwenden von Python-Modulen und -Bibliotheken? Numpy zum Beispiel?
Ja. Wir werden dies in der nächsten Sitzung ausführlicher behandeln.
Können Sie ein Phyton Big Data-Funktionsbeispiel (wie SVM Support Vector Machine) zeigen, das von Delphi aufgerufen wird und Ergebnisse an Delphi zurückgibt?
Ja, in der nächsten Sitzung.
danke – das war echt interessant
einverstanden
Tolles Zeug!! Vielen Dank!
einverstanden
Richtige Entscheidung, es in zwei Sitzungen aufzuteilen! Der erste Teil war sehr informativ, schnell und schwer genug
Ja, wir haben schnell gemerkt, dass dies für eine Sitzung zu viel werden würde. Möglicherweise werden auch in Zukunft mehr Sitzungen durchgeführt.
Vielen Dank, sehr interessant!
Großartig!, Freut sich sehr auf die nächste Sitzung. Vielen Dank für diese große Anstrengung
Ich verstehe, dass Sie jede IDE verwenden können? wie PyCharm?
Ja
Wenn Sie diese DLL verteilen, können Sie die Installation von Python auf dem Zielcomputer vermeiden, oder? Wie groß ist diese Python-DLL tatsächlich?
Weniger als 8 MB
Eine kleine FMX-Demo bitte.
Wir werden in der nächsten Sitzung eine haben.
Vielen Dank, ausgezeichnete Demo!
Delphi + Python + Docker…. Das wäre interessant
Sicher, einfach genug, sicher, einfach genug
ist es möglich ein Python Modul zu verwenden?
Ja
Jim und Kiriakos:
Nur um das Publikum zu verdeutlichen …
„Python4Delphi“ ist kein Cross-Compiler von Python für Delphi … Stattdessen ist dieses Projekt definitiv für die gleichzeitige Koexistenz von Delphi mit Python in beide Richtungen ausgelegt …
Richtig?
Ja, das ist richtig.
Wird es im zweiten Webinar ein Beispiel für die Verwendung der matplotlib lib über Delphi geben?
Ja
Ich bin in Teil 1 registriert, ich sollte in Teil 2 registriert sein. O Dies ist automatisch für die Sitzung 2
Bereits registriert.
Gute Sitzung! Vielen Dank!
Einverstanden, willkommen.
Gibt es bitte ein Referenzdokument?
Es gibt einige Dokumentation hier , mit 33 Demos und diesem Webinar
Ist es möglich, eine bestimmte virtuelle Umgebung auszuwählen, die von conda erstellt wurde?
Ja
Ist es möglich, von einer Delphi-Funktion einen STRING zur Python-Ausgabe zurückzukehren?
Ja
Danke, sehr interessant.
Kann ich auf matplotlib zugreifen? Wenn ja, wie, in separaten Fenstern oder eingebettet in eine GUI, z. B. in VCL
Begleiten Sie uns in 2 Wochen
Sehr gutes Zeug!
einverstanden
Können wir dieses Webinar später noch einmal ansehen oder mit einem Kollegen teilen?
Ja
Können Sie eine Python-Liste an Delphi übergeben?
natürlich.
Tolles Webinar! Es eröffnete sich Ideen, um Python und Delphi in meine Projekte zu integrieren. Ich freue mich auf das nächste Webinar.
Ja
Kann ich von Python aus auf Datenbankobjekte wie das clientdataset zugreifen?
Ja
Das letzte Mal, dass ich an Delphi gearbeitet habe, war 1995. P4D ist ein guter Grund, nach Delphi zurückzukehren!
Ja
Vielen Dank!
Hallo, ist d4p vollständig plattformübergreifend?
Ja, aber noch kein Python auf dem Handy. Ja, aber noch kein Python auf dem Handy.
Kann ich Sublime Text verwenden?
sicher
Genial!
Danke fürs Teilen / Zeigen.
Gibt es bitte eine Klassendokumentation oder Referenz?
Verwenden Sie die Quelle
Super Intro. Ich freue mich auf die nächsten Sitzungen. Ein großes Lob an Embarcadero für die Organisation dieses Webinars.
Vielen Dank!
Jim und Kiriakos: Nur um das Publikum zu verdeutlichen … „Python4Delphi“ ist kein Cross-Compiler von Python für Delphi … Stattdessen ist dieses Projekt definitiv für die gleichzeitige Koexistenz von Delphi mit Python in beide Richtungen ausgelegt … Richtig?
richtig
Sehr interessant. (Ich habe PascalScript von RemObjects in meiner Anwendung verwendet).
Gute Sitzung!
Gibt es Schulungen zu Python4Delphi?
noch nicht, aber ich arbeite daran.
funktioniert es unter mobilen Betriebssystemen? Android & IOS?
Python funktioniert nicht auf Mobilgeräten.
Wann ist das zweite Webinar?
zwei Wochen.
Ist geplant, Python4Delphi über GetIt Package Manager zu veröffentlichen, um die Installation zu vereinfachen?
Ja.
Kann ich von Python aus auf Datenbankobjekte wie das clientdataset zugreifen?
Ja
Wie kann Delphi aus Python auf andere Weise als das in DLL kompilierte Delphi-Projekt / -Modul verwendet werden?
Ja, nächste Sitzung in zwei Wochen.
Toll! Wie kann ich Python-Pakete mit Python-DLL verteilen?
Konsultieren Sie die Python-Dokumente.
Wie viele Teilnehmer sind hier, Jim?
Viel.
Arbeitete auf Chrome auf Mac
Gutes Zeug!
Wäre es der gleiche Webinar-Link für Teil 2? Oder muss ich nach einem neuen Link suchen?
Ja
Danke:)
Muss das Management der Referenzzählung manuell erfolgen? Können zukünftige Versionen der Bibliothek dies automatisieren?
Die bevorzugten Optionen führen eine automatische Referenzzählung durch.
Benötigen Sie eine python.dll, wenn Sie eine exe-Datei ausführen?
Ja
Wie viel wird es kosten?
Free / Open Source
Ist es möglich, von Python generierte Bitmaps zurück nach Delphi zu übertragen?
Ich denke an svg-> bmp-Konvertierungen usw.
In der Theorie
Danke für die Antwort!
Applaus von einem der Zuschauer. Ihr beide macht einen guten Job!
Wird P4D in der Delphi-Community kompiliert?
Ja
Sehr cool. Exzellentes Seminar. Danke, dass du das angezogen hast.
Liebte es! Öffnet so viele Möglichkeiten! Vielen Dank!
Ist es vollständig kompatibel mit RAD Server-Code, der unter Linux Ubuntu ausgeführt wird?
Ja ja
Tolles Webinar! Vielen Dank!
spielen seit ein paar Jahren damit. Können wir ein einfaches Beispiel für die Übergabe eines Arrays an Python, die Verarbeitung in Numpy und die Rückgabe an Delphi haben?
ja, werde daran arbeiten.
Cool! Ich freue mich auf die nächste Sitzung!
Bitte bleiben Sie sicher und gesund.
Vielen Dank
Kann es auf Android und IOS laufen?
noch nicht
So viel tolles Zeug – du brauchst einen Teil 3 – die Leute wollen mehr
Wie viele Entwickler tragen zu diesem Projekt bei? Dies ist ein Muss für jeden „modernen“ Delphi-Entwickler !!! ??
tolle Arbeit, danke für diese Sitzung, wir sehen uns in der nächsten!
Ausgezeichnetes Webinar. Sehr aufregend. Ich freue mich auf Teil 2. Genau das, wonach wir gesucht haben.
Ausgezeichnetes Zeug! Ich habe definitiv vor, P4D zu verwenden. Danke und Grüße aus Israel
Unterstützt Python4Delphi Multidevice (FMX)?
Ja, MacOS, Linux und Windows. Noch kein Python auf dem Handy.
Freuen Sie sich darauf, es in naher Zukunft im Get It Package Manager zu sehen.
Wird daran arbeiten.
Ich benutze Python auf AWS. Kann ich dort Delphi Object verwenden?
Wenn Sie es dort bereitstellen, dann ja. Stellen Sie einfach ein Linux-Modul bereit.
Tolle Demo. Ich freue mich darauf, mehr zu lernen.
Ja, bitte mehr Zeit für Python-Bibliotheken !!!
Wird besorgt
15 Jahre Delphi-Nutzung, 10 Jahre Python-Nutzung… Danke für Ihren Job !!!
Muss das Management der Referenzzählung manuell erfolgen? Können zukünftige Versionen der p4d-Bibliothek dies automatisieren?
Wenn Sie die High-Level-Wrapper-Komponenten verwenden, wird die Referenzzählung automatisch durchgeführt.
Was meinen Sie mit Python-Funktionen, auf die in Low-Level-Code von Dephi aus zugegriffen wird?
Delphi kann die Python-Funktionen direkt aufrufen.
Was können Sie sagen, welche Hauptvorteile der Verwendung von P4D gegenüber der Entwicklung von reinen Python-Projekten für maschinelles Lernen?
Verwenden Sie Delphi für die Benutzeroberfläche oder andere Integrationen
Wie können wir helfen; Magst du Pull Requests? Oder zuerst Vorschläge diskutieren?
Wie auch immer Sie sich engagieren wollen, ist großartig!
Ich habe viele Dinge mit Delphi unter Windows und Linux in AWS gemacht
Ah gut!
Glaubst du, du hast Tkinter ersetzt? Bitte sag ja
Das ist sicherlich ein Verwendungsszenario.
Genau das, was ich vorschlagen wollte!
Wenn ich demo01 kompiliere, zeigt es, dass ein Fehler die DLL „python32.dll“ nicht öffnen konnte. Ich kann die DLL nicht im Quellcode finden. Wie kann ich das beheben?
Sie müssen zuerst Python installieren und sicherstellen, dass die Bitness von Python mit der Bitness Ihrer Anwendung übereinstimmt (32 vs 64 Bit). Sie können beide installieren.
Könnte es sich nach dem Erfolg des Starts der Bold-Community lohnen, einen Discord-Kanal zu organisieren? oder gibt es schon ähnliche?
Auf jeden Fall etwas zu sehen.
Kann ich Delphi-Fehler von Python behandeln?
Ja
Wenn Sie Komponenten auf hoher Ebene haben, warum benötigen Sie Komponenten auf niedriger Ebene?
Die High-Level-Komponenten verwenden RTTI, sodass Sie mit den Low-Level-Komponenten etwas mehr Kontrolle haben und den RTTI-Overhead entfernen können.
Bitte listen Sie die High-Level-Klassen und die Low-Level-Klassen auf. Ich bin mir nicht sicher, welche welche sind.
TPyDelphiWrapper ist die übergeordnete Komponente.
Ich muss weitermachen! Danke Leute! Bis später!
Kann ich Python-Code von Delphi aus debuggen?
Sie können Python-Code nicht über die Delphi-IDE debuggen, aber Sie können PyScripter zum Debuggen des Codes verwenden. Ihre Delphi-Anwendung
Können wir ein in Delphi entwickeltes Beispielmodul erstellen und mit PIP installieren?
Ich versuche, das Paket für Delphi 10.4 zu kompilieren, aber die Einheit PythonAction hat eine Menge Fehler, weil sie Ansi- und Unicode-Zeichenfolgen falsch verwendet. Ist sie in Bearbeitung?
Ist es möglich, Speicher zwischen Delphi und Python zu teilen?
Sehr interessant, danke. Ich freue mich auf den 2. Platz
wirklich tolle Informationen, vielen Dank! Bis zum nächsten Mal
Wird die Automatisierung von Python-Tests beim nächsten Mal behandelt?
wenn Java bei Delphi?
Vielen Dank!
Danke ! Gut gemacht !
Vielen Dank, sehr geschätzt !!!
Vielen Dank!
Sehr nützlich
Danke
Vielen Dank
Vielen Dank!
Gracias a ustedes. Esperamos ansioso la segunda parte
en Chrome es simplemente para permitir que se descargue, use el botón desplegable
bueno saber
No veo las diapositivas en el zip de descarga
Son un PDF
gracias por el enlace de descarga!
Bienvenido
¿Por qué aparece el mensaje “Lo siento, esta parte del seminario web no se puede ver en su dispositivo”?
Muy raro. Lo siento por eso. No estoy seguro de por qué obtendrías eso. Me aseguraré de conseguirle un enlace de reproducción por correo electrónico.
¿Algún problema?
No hay problemas en este extremo.
Hola a todos
Hola
Todavía no he hecho mucho con Python, pero Python también está disponible en la Tienda Windows. La instalación / desinstalación con un clic puede ser útil.
Cierto.
Buen tema, estoy impresionado
También estoy aprendiendo mucho.
Si quiero usar Python en una aplicación cliente, exe para Windows (10) , ¿necesito tener Python instalado en la máquina cliente?
Si. Puede distribuir Python con su aplicación o pedirles que lo instalen.
Recibiendo muchos errores de clase, por ejemplo, TSynEdit no encuentra mensajes de error al intentar ejecutar las demostraciones. ¿Estoy haciendo algo mal?
TSynEdit está disponible en GetIt, primero debes instalarlo.
¿Esta integración funcionará en una Dll de Isapi que se ejecute en IIS?
Debería.
hola, me gustaría preguntar acerca de la aplicación multiproceso: ¿puedo inicializar python.dll para cada subproceso delphi y ejecutar código en paralelo?
Eso está cubierto en la parte 2
¿Cómo podemos obtener componentes SynEdit? ¿Es de código abierto?
Es de código abierto y está disponible a través del administrador de paquetes GetIt en el IDE o descárguelo aquí Synedit
Desafortunadamente, el requisito no es una opción. ¿Qué distribución de Python puedo incluir en la instalación de mi aplicación? Cual es su tamaño MB, GB? Gracias
Obtén los 8 MB
¿Los usuarios finales necesitan tener Python instalado en la máquina de destino?
El usuario final lo necesita preinstalado o puede distribuir la DLL de Python con su aplicación.
¿Dónde conseguir ese Synedit? No está incluido con Py4D, ¿verdad?
TSynEdit está en el administrador de paquetes GetIt en el IDE y está disponible aquí
¿Es posible ejecutar un script de Python dentro de un hilo?
Sí, pero lo cubriremos con más detalles en el próximo seminario web.
¿Podría explicar cómo se instalan los componentes de Python?
Agregaré pasos de instalación detallados y más detalles aquí
Buenos dias..JS
¡Gracias!
¿La repetición estará disponible para esta sesión?
Sí, recibirás un correo electrónico con la repetición y publicaré la repetición para ambas mitades y recursos adicionales aquí.
¡Es fantástico!
convenido
Espero que una forma esté disponible para enviar el dll compilado dentro del exe como un recurso y luego extraerlo en tiempo de ejecución a alguna carpeta temporal o usarlo como un recurso extraído en memoria
En teoría, podrías hacer eso.
En la aplicación CAD Rhinoceros, utilizan una versión corta de phyton llamada iron phyton para la creación de complementos. ¿Es posible mezclar esta pequeña biblioteca con Delphi y crear un complemento con Delphi?
si
para, en, importar: las palabras clave no están resaltadas
Había algo mal con el resaltado de sintaxis allí. Eso es lo que sucede con Live Demos.
¿Necesitamos agregar una ruta a Python en las opciones del proyecto?
Hay algunas opciones de redistribución.
¿Qué pasa si la sintaxis es incorrecta?
Proporcionará comentarios sobre los errores y puede manejarlos en su programa
1. ¿Incluirá un enlace a este sencillo ejemplo de demostración en el enlace?
¿Hay alguna forma de administrar diferentes instancias de python desde la aplicación delphi o es una aplicación delphi con solo una instancia de python?
Puedes gestionar eso desde TPythonEngine
¿Puedo usarlo en una aplicación web?
En teoria. Tiene algunas preocupaciones adicionales con las aplicaciones web, por lo que debería tener cuidado con su modelo de subprocesos, pero si tiene cuidado, entonces debería funcionar bien.
¡Qué buen presentador es!
si
¿Funcionará esto también con C ++ Builder?
La mayor parte de la funcionalidad debería funcionar con C ++ Builder.
jeje, supongo que Delphi permitiría la creación de interfaces visuales mucho mejores que tkinter
Ah, sí, fui y exploré las opciones de Python para crear GUI y me recordaron la creación de GUI previa a Delphi. Delphi es fantástico para agregar GUI a una aplicación Python.
¿Cómo se manejan las excepciones de Python? ¿Se crean pyc cuando se ejecuta el script? Si no, entonces la segunda ejecución i python es más rápida que en delphi
El componente captura los errores y los convierte en excepciones de Delphi para que usted los maneje.
Necesito implementar un Listener para Firebase, pude instalar Python y la biblioteca, pero no pude dejar el código de Python ejecutándose
¿Ha comparado ese tiempo de Python con el código de Python compilado?
Python compilado sería más rápido que la demostración, pero hay otras mejoras de rendimiento a través de la biblioteca paralela. Por tanto, siempre hay opciones para mejorar el rendimiento.
Necesito implementar un Listener para Firebase, pude instalar Python y la biblioteca, pero no pude dejar el código de Python ejecutándose
¿Existe una limitación de las librerías de Python importadas? por ejemplo, ¿podemos importar opencv, matplotlib, scipy, scikit?
Sí, puedes usar todos esos.
Tal vez me perdí la información sobre el “tamaño de distribución requerido” que podría incluirse en la instalación de la aplicación delphi de los usuarios finales.
alrededor de 8 MB
¿Es posible pasar variables de Delphi a Python?
si
¿Los componentes SynEdit / TPython__ son compatibles con Delphi Seattle?
si.
¡Muy impresionante! Si he visto bien, hay algunas restricciones en FreePascal / Lazarus en este momento sobre el manejo de cambios de variantes.
si
Exactamente ese es mi problema, las pocas opciones de redistribución. Necesito encontrar el tamaño mínimo para el usuario final.
Usa la versión incrustable y es muy pequeña
¿Cómo sabe Python dónde obtener el delphi_module?
Para las demostraciones de hoy lo dice, pero en el próximo webinar mostraremos cómo crear módulos para usar fuera de Delphi.
¿Puedo usar interacciones con Python desde Delphi 10.3.3?
si
¿Funciona también con Berlín?
si
¿Estará disponible este feed de “Preguntas” más adelante? Hay algunas cosas buenas aquí.
Sí, los incluiré en la publicación del blog con la repetición.
¿Puedo pasar el objeto Delphi a Python y llamar a los métodos del objeto en Python?
sí, demostrando un Registro en breve, pero también puede hacerlo con Objeto y Registro.
Asombroso
Convenido
Sería interesante ver cómo se pueden construir DLL en Delphi que se llaman desde Python puro; fuera de Delphi.
Creo que se tratará en la segunda parte en 2 semanas.
??
¿Cuándo es la próxima sesión?
en dos semanas al mismo tiempo. Ya estás registrado
¿Es capaz de subprocesos múltiples?
si
Si quiero distribuir las DLL de Python y algunas bibliotecas junto con mi aplicación en algún subdirectorio, ¿cómo le digo al sistema en qué ruta se encuentran estas bibliotecas?
Sí, a través de TPythonEngine
Estoy realmente impresionado con el orador y la forma en que puede manipular la pantalla haciendo zoom y plegando en la página siguiente. ¿Cómo lo hace, por favor?
Sería interesante ver el resultado del objeto delphi Ref: print (type (Ref)) print (dir (Ref)) print (help (Ref))
son tipos de Python
Comparar python con los tiempos de ejecución de Delphi parece realmente incómodo para las personas que necesitan desparetaly esas bibliotecas de tensorFlow, anaconda, panda y cualquier otra biblioteca de Python. ¿Realmente necesito Delphi?
Delphi facilita la construcción de la GUI y luego llamar a las bibliotecas lingote TensorFlow Python, etc., Delphi facilita la construcción de la GUI y luego llamar a las bibliotecas lingote TensorFlow Python, etc.
realmente agradable y fácil de usar
¡Cosas realmente asombrosas!
convenido
¿La grabación de esta sesión será de libre acceso?
¡Hola! ¿Esta biblioteca (Python4Delphi) le permite vincular y usar el módulo y la biblioteca de Python sin problemas? ¿Numpy por ejemplo?
si. Cubriremos eso con más detalles en la próxima sesión.
¿Puede mostrar un ejemplo de función Phyton Big Data, como SVM Support Vector Machine) que se llama frm Delphi y devuelve resultados a Delphi?
Sí, en la próxima sesión.
gracias – eso fue realmente interesante
convenido
¡¡Buena cosa!! ¡Gracias!
convenido
¡Decisión acertada de dividirlo en dos sesiones! La primera parte fue muy informativa, rápida y lo suficientemente pesada.
Sí, rápidamente nos dimos cuenta de que esto iba a ser demasiado para una sola sesión. También puede terminar haciendo más sesiones en el futuro.
¡Muchas gracias, muy interesante!
¡Genial! Esperamos ansiosamente la próxima sesión. Gracias a todos por este gran esfuerzo
Entiendo que puede usar cualquier IDE. como PyCharm?
si
Al distribuir esta DLL, puede evitar la instalación de Python en la máquina de destino, ¿verdad? ¿Qué tan grande es realmente esta DLL de Python?
Menos de 8 MB
Una pequeña demostración de FMX, por favor.
Tendremos uno en la próxima sesión.
Gracias, excelente demo !!!!
Delphi + Python + Docker…. Eso puede ser interesante
Seguro, bastante fácil, seguro, bastante fácil
¿Es posible usar un módulo de Python?
si
Jim y Kiriakos:
Solo para aclarar a la audiencia…
“Python4Delphi” _no_ es un compilador cruzado de Python para Delphi… En cambio, este proyecto está definitivamente diseñado para la _ coexistencia simultánea de Delphi con Python_, en cualquier dirección …
¿ Verdad ?
sí, eso es exacto.
¿Habrá un ejemplo del uso de matplotlib lib a través de Delphi en el segundo seminario web?
si
Estoy registrado en la parte 1, debo registrarme en la parte 2 o esto es automático, para la sesión 2
Ya registrado.
¡Buena sesión! ¡Gracias!
De acuerdo, bienvenido.
hay un documento de referencia por favor?
Hay algo de documentación aquí , con 33 demostraciones, y este seminario web
Si es posible seleccionar un entorno virtual particular creado por conda?
si
¿Es posible regresar de una función delphi a STRING a la salida de Python?
si
Gracias, muy interesante.
¿Puedo acceder a matplotlib? Si es así, ¿cómo, en ventanas separadas o incrustado en una GUI, por ejemplo, dentro de VCL?
Únase a nosotros en 2 semanas
¡Muy buenas cosas!
convenido
¿Podremos volver a ver este seminario web más tarde o compartirlo con un colega?
si
¿Puede pasar una lista de Python a Delphi?
por supuesto.
¡Gran seminario web! Abrió de ideas para integrar Python y Delphi en mis proyectos. Esperamos el próximo seminario web.
si
¿Puedo acceder a objetos de base de datos como el clientdataset de Python?
si
La última vez que trabajé en Delphi fue en 1995. ¡P4D es una buena razón para volver a Delphi!
si
¡Gracias!
hola, ¿es d4p completamente multiplataforma?
sí, pero aún no Python en dispositivos móviles., sí, pero no Python en dispositivos móviles todavía.
¿Puedo usar Sublime Text?
Por supuesto
¡Increíble!
Gracias por compartir / mostrar.
¿Hay alguna documentación de clase o referencia por favor?
usa la fuente
Intro impresionante. Esperando las próximas sesiones. Felicitaciones a Embarcadero por organizar este seminario web.
¡Gracias!
Jim y Kiriakos: Solo para aclarar a la audiencia… “Python4Delphi” _no_ es un compilador cruzado de Python para Delphi… En cambio, este proyecto está definitivamente diseñado para la _ coexistencia simultánea de Delphi con Python_, en cualquier dirección … ¿Verdad?
correcto
Muy interesante. (Usé PascalScript de RemObjects en mi aplicación).
¡Buena Sesión!
¿Hay algún entrenamiento disponible sobre Python4Delphi?
todavía no, pero estoy trabajando en ello.
¿Funciona en sistemas operativos móviles? Android e IOS?
Python no funciona en dispositivos móviles.
¿Cuándo es el segundo seminario web?
dos semanas.
¿Está previsto publicar Python4Delphi a través de GetIt Package Manager para simplificar la instalación?
Si.
¿Puedo acceder a objetos de base de datos como el clientdataset de Python?
si
¿Cómo se puede usar delphi desde python de otra manera que el proyecto / módulo delphi compilado en dll?
sí, próxima sesión en dos semanas.
¡Excelente! ¿Cómo puedo distribuir paquetes de Python con Python dll?
Consulte los documentos de Python.
¿Cuántos asistentes hay aquí, Jim?
Mucho.
Trabajó en Chrome en mac
¡Buen material!
¿Sería el mismo enlace de seminario web para la parte 2? ¿O necesito buscar un nuevo enlace?
si
Gracias:)
¿La gestión del recuento de referencias tiene que ser manual? ¿Pueden las futuras versiones de la biblioteca automatizar esto?
Las opciones preferidas realizan el recuento automático de referencias.
¿Se necesita un python.dll cuando se ejecuta un archivo exe?
si
¿Cuanto costara?
libre / código abierto
¿Es posible transferir mapas de bits, generados por Python, de nuevo a Delphi?
Estoy pensando en conversiones svg-> bmp, etc.
En teoria
¡Gracias por su respuesta!
Aplausos de uno de los asistentes. ¡Ambos están haciendo un buen trabajo!
¿Se compilará P4D en la comunidad Delphi?
si
Muy genial. Excelente seminario. Gracias por ponértelo.
¿Es totalmente compatible con el código del servidor RAD que se ejecuta en Linux Ubuntu?
sí Sí
¡Gran seminario web! ¡Gracias!
He estado jugando con esto de forma intermitente durante algunos años. ¿Podemos tener un ejemplo simple de entregar una matriz a Python, procesar en numpy y devolver a Delphi?
sí, trabajará en eso.
¡Frio! ¡Esperamos la próxima sesión!
Por favor, manténganse seguros y sanos a todos.
Gracias
¿Puede ejecutarse en Android e IOS?
aún no
Tantas cosas geniales para cubrir, necesitas una parte 3, la gente quiere más
¿Cuántos desarrolladores están contribuyendo a este proyecto? ¡¡¡Esto es imprescindible para cualquier desarrollador de Delphi de la “era moderna” !!! ??
gran trabajo, gracias por esta sesión, ¡nos vemos en la próxima!
Excelente seminario web. Muy emocionante. Esperando la parte 2. Excamente lo que estábamos buscando.
¡Excelente material! Definitivamente tengo la intención de usar P4D. Gracias y saludos desde Israel
¿Es compatible Python4Delphi con varios dispositivos (FMX)?
sí, macOS, Linux y Windows. Aún no hay Python en dispositivos móviles.
Esperamos verlo en Get It Package Manager en un futuro próximo.
Trabajará en eso.
Utilizo python en AWS. ¿Puedo usar Delphi Object allí?
si lo implementa allí, entonces sí. Simplemente implemente un módulo de Linux.
Demostración impresionante. Tengo ganas de aprender más.
Sí, ¡más tiempo en las bibliotecas de Python, por favor!
haré
15 años de uso de Delphi, 10 años de uso de Python… ¡¡¡Gracias por tu trabajo !!!
¿La gestión del recuento de referencias tiene que ser manual? ¿Pueden las futuras versiones de la biblioteca p4d automatizar esto?
Cuando utiliza los componentes de envoltura de alto nivel, maneja el conteo de referencias automático.
¿Qué quiere decir con el acceso a las funciones de Python en código de bajo nivel desde Dephi?
Delphi puede llamar a las funciones de Python directamente.
¿Qué puedes decir sobre las principales ventajas de usar P4D frente al desarrollo de proyectos de aprendizaje automático de Python puro?
He hecho muchas cosas con Delphi en Windows y Linux en AWS
¡Ah, genial!
¿Crees que reemplazaste a Tkinter? porfavor di que si
Ese es ciertamente un senario de uso.
¡Exactamente lo que quería proponer!
Cuando compilo demo01, se muestra un error que no pudo abrir la DLL “python32.dll”, no puedo encontrar la DLL en el código fuente, ¿cómo solucionarlo?
Primero debe instalar Python y asegurarse de que el bitness de Python coincida con el bitness de su aplicación (32 vs 64 bit). Puede instalar ambos.
Después del éxito del lanzamiento de la comunidad Bold, ¿podría valer la pena organizar un canal de Discord? o hay algo similar ya?
Ciertamente, algo para mirar.
¿Puedo manejar errores de Delphi desde Python?
si
si tiene componentes de alto nivel, ¿por qué necesitaría componentes de bajo nivel?
Los componentes de alto nivel usan RTTI, por lo que los componentes de bajo nivel le brindan un poco más de control y le permiten eliminar la sobrecarga de RTTI.
Por favor enumere las clases de alto nivel y las clases de bajo nivel, no estoy seguro de cuáles son cuáles.
TPyDelphiWrapper es el componente de alto nivel.
¡Necesito continuar! ¡Gracias amigos! ¡Nos vemos más tarde!
¿Puedo depurar código Python desde Delphi?
No puede depurar el código Python desde el IDE de Delphi, pero puede usar PyScripter para depurar el código. Su aplicación Delphi
¿Podemos crear un módulo de muestra diseñado en Delphi e instalarlo con PIP?
Estoy tratando de compilar el paquete para Delphi 10.4, pero la unidad PythonAction tiene muchos errores debido al uso incorrecto de cadenas Ansi y Unicode … ¿está en progreso?
¿Es posible compartir memoria entre Delphi y Python?
Muy interesante, gracias. Esperando el segundo
realmente buena información, muchas gracias! hasta la próxima
¿Se cubrirá la automatización de pruebas de Python la próxima vez?
cuando Java en Delphi?
¡Gracias!
Gracias ! Gran trabajo !
Gracias chicos, muy apreciado !!!
¡Gracias!
Realmente util
gracias
Gracias
¡Muchas gracias!
Gracias a ustedes. Esperamos ansioso la segunda parte
Essa integração funcionará em um Isapi Dll em execução no IIS?
Deveria.
oi, gostaria de perguntar sobre o aplicativo multithread – posso inicializar python.dll para cada thread delphi e executar o código em paralelo?
Isso é abordado na parte 2
Como podemos obter os componentes SynEdit? É código aberto?
É Open Source e está disponível através do gerenciador de pacotes GetIt no IDE ou baixe aqui Synedit
A exigência não é uma opção, infelizmente. Que distribuição Python posso incluir na instalação do meu aplicativo? Qual é o seu tamanho? MB, GB? obrigado
Obtenha os 8 MB
Os usuários finais precisam ter o Python instalado na máquina de destino?
O usuário final precisa dele pré-instalado ou você pode distribuir a DLL do Python com seu aplicativo.
Onde obter esse Synedit? Não está incluído no Py4D, está?
TSynEdit está no gerenciador de pacotes GetIt no IDE e disponível aqui
É possível executar o script python dentro de um segmento?
Sim, mas abordaremos isso com mais detalhes no próximo webinar.
Você poderia explicar como os componentes do python são instalados
Vou adicionar etapas de instalação detalhadas e mais detalhes aqui
Bom dia..JS
Obrigado!
O replay estará disponível para esta sessão, por favor
Sim, você receberá um e-mail com o replay e eu irei postá-lo para as duas metades e recursos adicionais aqui
E fantastico!
acordado
Uma forma que espero estar disponível para enviar a dll compilada dentro do exe como um recurso e depois extraí-la em tempo de execução para alguma pasta temporária ou usá-la como um recurso extraído na memória
Em teoria, você poderia fazer isso.
No aplicativo CAD Rhinoceros, eles usam uma versão curta do phyton chamado iron phyton para a criação do plugin. É possível misturar esta pequena biblioteca com Delphi e criar um plugin com Delphi?
sim
para, em, importação – palavras-chave não são destacadas
Havia algo errado com o realce de sintaxe ali. É o que acontece com as Live Demos.
Precisamos adicionar um caminho para python nas opções do projeto?
Existem algumas opções de redistribuição.
o que acontece se a sintaxe estiver errada?
Ele fornecerá feedback sobre erros e você pode lidar com isso em seu programa
1. você incluirá um link para este exemplo simples de demonstração no link?
Existe uma maneira de gerenciar diferentes instâncias de python do aplicativo delphi ou é um aplicativo delphi com apenas uma instância de python?
Você pode gerenciar isso no TPythonEngine
posso usar no aplicativo da web?
Em teoria. Você tem algumas preocupações adicionais com os aplicativos da web, então você precisa ter cuidado com seu modelo de threading, mas se você for cuidadoso, ele deve funcionar bem.
Que bom apresentador ele é!
sim
Isso funcionará com o C ++ Builder também?
A maior parte da funcionalidade deve funcionar com o C ++ Builder.
hehe, acho que o Delphi permitiria a criação de interfaces visuais muito melhores do que o tkinter
Ah, sim, eu explorei as opções do Python para a criação de GUI e elas me lembraram da criação de GUI pré-Delphi. Delphi é fantástico em adicionar GUI a um aplicativo Python.
como as exceções do python são tratadas? são criados pyc quando o script é executado? Se não, então a segunda execução i python é mais rápida do que em delphi
O componente captura os erros e os converte em exceções Delphi para você manipular.
Preciso implementar um Listener para Firebase, consegui instalar o Python e a biblioteca, mas não consegui deixar o código Python em execução
Você comparou esse tempo de python ao código python compilado?
O Python compilado seria mais rápido do que o demo, mas há outras melhorias de desempenho por meio da biblioteca paralela. Portanto, sempre há opções para melhorar o desempenho.
Preciso implementar um Listener para Firebase, consegui instalar o Python e a biblioteca, mas não consegui deixar o código Python em execução
existe uma limitação de libs python importados? por exemplo, podemos importar opencv, matplotlib, scipy, scikit?
Sim, você pode usar todos eles.
Talvez eu tenha esquecido de informações sobre o “tamanho de distribuição necessário” que poderia ser incluído na instalação do aplicativo Delphi pelos usuários finais.
cerca de 8 MB
É possível passar variáveis de Delphi para Python?
sim
Os componentes SynEdit / TPython__ oferecem suporte a Delphi Seattle?
sim.
Muito impressionante! Se eu vi direito, existem algumas restrições no FreePascal / Lazarus no momento sobre o tratamento de alterações de variantes.
sim
Exatamente esse é o meu problema as poucas opções de redistribuição. Preciso encontrar o tamanho mínimo para o usuário final.
Use a versão incorporável e é muito pequena
Como o Python sabe onde obter o delphi_module?
Para as demonstrações de hoje, ele diz isso, mas no próximo webinar mostraremos como criar módulos para uso fora do Delphi.
Posso usar interações com Python do Delphi 10.3.3?
sim
Funciona também com Berlim?
sim
Este feed de “Perguntas” estará disponível mais tarde? Existem algumas coisas boas aqui.
Sim, irei incluí-los na postagem do blog com o replay
Posso passar objeto delphi para python e chamar métodos de objeto em python?
sim, demonstrando um registro em breve, mas pode fazer com objeto e registro também.
Surpreendente
Acordado
Seria interessante ver como você poderia construir DLLs em Delphi que você chama de Python puro; fora da Delphi.
Acredito que será abordado na 2ª parte em 2 semanas.
??
Quando é a próxima sessão?
em duas semanas ao mesmo tempo. Você já está registrado
É capaz de multithreading?
sim
Se eu quiser distribuir as DLLs do Python e algumas bibliotecas junto com meu aplicativo em algum subdiretório, como posso informar ao sistema em que caminho essas bibliotecas estão localizadas?
Sim, via TPythonEngine
Estou realmente impressionado com o palestrante e a maneira como ele pode manipular a tela, ampliando e dobrando para a próxima página. Como ele faz isso, por favor?
Seria interessante ver a saída para o objeto delphi Ref: print (type (Ref)) print (dir (Ref)) print (help (Ref))
eles são tipos Python
Comparar python com temporizações de execução delphi parece realmente estranho para pessoas que precisam desesperadamente de tensorFlow, anaconda, panda e quaisquer outras bibliotecas python. Eu realmente preciso do Delphi?
O Delphi facilita a construção da GUI e, em seguida, chama as bibliotecas Python do TensorFlow do lingote etc., o Delphi facilita a construção da GUI e depois chama as bibliotecas do TensorFlow Python do lingote etc.
muito bom e simples de usar
Coisas realmente incríveis!
acordado
A gravação desta sessão estará acessível gratuitamente?
Olá! Esta biblioteca (Python4Delphi) permite vincular perfeitamente e usar o módulo e a biblioteca Python? Numpy por exemplo?
sim. Abordaremos isso com mais detalhes na próxima sessão.
Você pode mostrar um exemplo de função Phyton Big Data, como SVM Support Vector Machine) sendo chamado de Delphi frm e retornando resultados para Delphi?
Sim, na próxima sessão.
obrigado – isso foi realmente interessante
acordado
Coisas boas!! Obrigado!
acordado
Decisão certa de dividir em duas sessões! A primeira parte foi muito informativa, rápida e pesada o suficiente
Sim, rapidamente percebemos que isso seria demais para uma sessão. Pode acabar fazendo mais sessões no futuro também.
Muito obrigado, muito interessante!
Ótimo !, aguardo ansiosamente a próxima sessão. Obrigado a todos por este grande esforço
Eu entendo que você pode usar qualquer IDE? gosta de PyCharm?
sim
Ao distribuir essa DLL, você pode evitar a instalação do Python na máquina de destino, certo? Qual o tamanho dessa DLL do Python?
Menos de 8 MB
Uma pequena demonstração FMX, por favor.
Teremos um na próxima sessão.
Obrigado, excelente demo !!!!
Delphi + Python + Docker…. isso seria interessante
Claro, fácil o suficiente, Claro, fácil o suficiente
é possível usar um módulo python?
sim
Jim e Kiriakos:
Só para esclarecer para o público…
“Python4Delphi” _não_ é um compilador cruzado de Python para Delphi… Em vez disso, este projeto foi definitivamente projetado para a _coexistência simultânea de Delphi com Python_, em qualquer direção…
Certo?
sim, isso é correto.
Haverá um exemplo de uso da lib matplotlib via Delphi no segundo webinar?
sim
Estou registado na parte 1, devo registar-me na parte 2 o isto é automático, para a sessão 2
Já registrado.
Boa sessão! Obrigado!
Concordo, bem-vindo.
existe um documento de referência, por favor?
Há alguma documentação aqui , com 33 demos, e este webinar
Se for possível selecionar um determinado ambiente virtual criado por conda?
sim
É possível retornar de uma função delphi um STRING para a saída python?
sim
Obrigado, muito interessante.
Posso acessar o matplotlib? Se sim, como, em janelas separadas, ou embutido em uma GUI, por exemplo, dentro do VCL
Junte-se a nós em 2 semanas
Muito bom!
acordado
Poderemos assistir a este webinar novamente mais tarde ou compartilhá-lo com um colega?
sim
Você pode passar uma lista Python para Delphi?
claro.
Ótimo webinar! Abriu novas ideias para integrar Python e Delphi em meus projetos. Ansioso pelo próximo webinar.
sim
Posso acessar objetos de banco de dados como o clientdataset do python?
sim
A última vez que trabalhei no Delphi foi em 1995. P4D é um bom motivo para voltar ao Delphi!
sim
Obrigado!
Olá, o d4p é totalmente multiplataforma?
sim, mas nenhum Python no celular ainda., sim, mas nenhum Python no celular ainda.
Posso usar o Sublime Text?
certo
Impressionante!
Obrigado por compartilhar / mostrar.
existe alguma documentação de classe ou referência, por favor?
use a fonte
Incrível introdução. Ansioso pelas próximas sessões. Parabéns à Embarcadero por organizar este webinar.
Obrigado!
Jim e Kiriakos: Só para esclarecer para o público… “Python4Delphi” _não_ é um compilador cruzado de Python para Delphi… Em vez disso, este projeto foi definitivamente projetado para a _coexistência simultânea de Delphi com Python_, em qualquer direção… Certo?
corrigir
Muito interessante. (Eu usei PascalScript de RemObjects em meu aplicativo).
Boa Sessão!
Existe algum treinamento sobre Python4Delphi disponível?
ainda não, mas estou trabalhando nisso.
funciona no sistema operacional móvel? Android e IOS?
Python não funciona em dispositivos móveis.
quando é o segundo webinar?
duas semanas.
Está planejado publicar o Python4Delphi através do Gerenciador de Pacotes GetIt para simplificar a instalação?
Sim.
Posso acessar objetos de banco de dados como o clientdataset do python?
sim
Como delphi pode ser usado a partir de python de outra forma que o projeto / módulo delphi compilado em dll?
sim, próxima sessão em duas semanas.
Ótimo! Como posso distribuir pacotes Python com dll Python?
Consulte a documentação do Python.
Quantos participantes estão aqui, Jim?
Muito.
Trabalhou no Chrome no mac
Coisa boa!
seria o mesmo link do webinar para a parte 2? Ou preciso pesquisar um novo link?
sim
Obrigado:)
o gerenciamento da contagem de referência deve ser manual? as versões futuras da biblioteca podem automatizar isso?
As opções preferidas fazem a contagem automática de referência.
há necessidade de um python.dll ao executar o arquivo exe?
sim
Quanto vai custar?
livre / código aberto
É possível transferir bitmaps, gerados por Python, de volta para Delphi?
Estou pensando em conversões svg-> bmp etc.
Em teoria
Obrigado pela resposta!
Aplausos de um dos presentes. Vocês dois estão fazendo um bom trabalho!
O P4D compilará na comunidade Delphi?
sim
Muito legal. Excelente seminário. Obrigado por colocar isso.
Amei! Abre tantas oportunidades! Obrigado!
É totalmente compatível com o código do servidor RAD em execução no Linux Ubuntu?
sim Sim
Ótimo webinar! Obrigado!
tenho brincado com isso há alguns anos. Podemos ter um exemplo simples de entrega de um array para python, processamento em numpy e devolução para delphi
sim, funcionará nisso.
Legal! Ansioso pela próxima sessão!
Por favor, fiquem todos seguros e saudáveis.
obrigado
pode ser executado no Android e IOS?
ainda não
Tantas coisas boas para cobrir – você precisa de uma parte 3 – as pessoas querem mais
Quantos desenvolvedores estão contribuindo para este projeto? Esta é uma obrigação para qualquer desenvolvedor Delphi da “era moderna” !!! ??
ótimo trabalho, obrigado por esta sessão, até a próxima!
Excelente webinar. Muito exitante. Ansioso para a parte 2. Excatly o que estávamos procurando.
Excelente! Definitivamente, pretendo usar o P4D. Obrigado e cumprimentos de Israel
que Python4Delphi é compatível com vários dispositivos (FMX)?
sim, macOS, Linux e Windows. Ainda não há Python no celular.
Esperamos vê-lo no Get It Package Manager em um futuro próximo.
Vou trabalhar nisso.
Eu uso python no AWS. Posso usar Delphi Object lá?
se você implantar lá, sim. Basta implantar um módulo Linux.
Demonstração incrível. Estou ansioso para aprender mais.
Sim, mais tempo nas bibliotecas Python, por favor !!!
vai fazer
15 anos de uso de delphi, 10 anos de uso de python… Obrigado pelo seu trabalho !!!
o gerenciamento da contagem de referência deve ser manual? as versões futuras da biblioteca p4d podem automatizar isso?
Quando você usa os componentes de invólucro de alto nível, ele lida com a contagem de referência automática.
O que você quer dizer com funções Python sendo acessadas em código de baixo nível do Dephi?
Delphi pode chamar as funções Python diretamente.
O que você pode dizer sobre quais são as principais vantagens de usar P4D em comparação ao desenvolvimento de projetos de aprendizado de máquina em Python puro?
Use Delphi para UI ou outras integrações
Como podemos ajudar; você gosta de solicitações pull? Ou primeiro discuta propostas?
Como você quer se envolver é ótimo!
Eu fiz muitas coisas com Delphi em windows e linux na AWS
Ah, ótimo!
Você acha que substituiu o Tkinter? por favor diga sim
Esse é certamente um senário de uso.
Exatamente o que eu queria propor!
Quando eu compilo o demo01, mostra um erro, não foi possível abrir a DLL “python32.dll”, não consigo encontrar a dll no código-fonte, como corrigi-lo?
Você precisa instalar o Python primeiro e certificar-se de que a quantidade de bits do Python corresponde à quantidade de bits do seu aplicativo (32 x 64 bits), você pode instalar os dois.
Após o sucesso do lançamento da comunidade Bold, pode valer a pena organizar um canal Discord? ou já existe algo semelhante?
Certamente algo para se olhar.
Posso lidar com erros delphi do python?
sim
se você tem componentes de alto nível, por que precisa de componentes de baixo nível?
Os componentes de alto nível usam RTTI, então os componentes de baixo nível fornecem um pouco mais de controle e permitem a remoção da sobrecarga do RTTI.
Por favor, liste as classes de alto nível e as classes de baixo nível, não tenho certeza quais são quais.
TPyDelphiWrapper é o componente de alto nível.
Eu preciso continuar! Obrigado pessoal! Até logo!
Posso depurar o código Python do Delphi?
Você não pode depurar o código Python do Delphi IDE, mas pode usar o PyScripter para depurar o código. Seu aplicativo Delphi
Podemos criar um módulo de amostra projetado em Delphi e instalar com PIP?
Estou tentando compilar o pacote para Delphi 10.4, mas a unidade PythonAction tem muitos bugs por causa do uso incorreto de strings Ansi e Unicode … está em andamento?
É possível compartilhar memória entre Delphi e Python
Muito interessante, obrigado. Ansioso para a 2ª
informações realmente ótimas, muito obrigado! vejo você na próxima vez
A automação de teste do python será abordada na próxima vez?
quando Java em Delphi?
Obrigado!
Obrigado ! Bom trabalho !
Obrigado pessoal, muito apreciado !!!
Obrigado!
Muito útil
THX
Obrigado
Muito obrigado!
Gracias a ustedes. Esperamos ansioso la segunda parte
в Chrome это просто разрешить его загрузку, используйте кнопку раскрывающегося списка
приятно знать
Я не вижу слайдов в архиве загрузки
Это PDF
спасибо за ссылку для скачивания!
Добро пожаловать
почему я получаю «Извините, эту часть веб-семинара нельзя просмотреть на вашем устройстве»?
Очень странный. Прости за это. Не уверен, почему вы это получили. Я обязательно пришлю вам ссылку для воспроизведения по электронной почте.
Любая проблема?
Никаких проблем с этим.
Привет всем
Здравствуйте
Я пока не особо много работал с Python, но Python также доступен в Магазине Windows. Установка / удаление в один клик может быть удобной.
Правда.
Хорошая тема, я впечатлен
Я тоже многому учусь.
Если я хочу использовать python в клиентском приложении — exe для Windows (10), тогда мне нужно установить python на клиентском компьютере?
Да. Вы можете либо распространять Python вместе с вашим приложением, либо требовать от них его установки.
Получение большого количества ошибок класса, например TSynEdit not found, сообщения об ошибках при попытке запустить демонстрационные версии. Я делаю что-то неправильно?
TSynEdit доступен в GetIt, вам необходимо сначала установить его.
Будет ли эта интеграция работать в Isapi Dll, работающей на IIS?
Должно.
привет, я хотел бы спросить о многопоточном приложении — могу ли я инициализировать python.dll для каждого потока delphi и выполнять код параллельно?
Это рассматривается в части 2
Как мы можем получить компоненты SynEdit? Это открытый исходный код?
Он имеет открытый исходный код и доступен через диспетчер пакетов GetIt в среде IDE или загрузите его здесь Synedit
К сожалению, требование не является вариантом. Какой дистрибутив Python я могу включить в установку моего приложения? Какой у него размер? МБ, ГБ? Благодарность
Получите 8 МБ
Нужно ли конечным пользователям иметь установленный Python на целевой машине?
Либо конечному пользователю она нужна предварительно, либо вы можете распространить Python DLL вместе с вашим приложением.
Где взять этот Synedit? Его нет в Py4D, не так ли?
TSynEdit находится в диспетчере пакетов GetIt в среде IDE и доступен здесь
Можно ли запустить скрипт python внутри потока?
Да, но мы рассмотрим это более подробно на следующем вебинаре.
Не могли бы вы объяснить, как устанавливаются компоненты Python?
Я добавлю подробные инструкции по установке и подробности здесь
Доброе утро … JS
Благодарность!
Будет ли доступен повтор этого сеанса, пожалуйста
Да, вы получите электронное письмо с воспроизведением, и я опубликую его для обеих половин и дополнительных ресурсов здесь
Это фантастически!
согласовано
Один из способов, я надеюсь, будет доступен для доставки dll, скомпилированной внутри exe, в качестве ресурса, а затем извлекать ее во время выполнения либо в какую-то временную папку, либо использовать ее как извлеченный ресурс в памяти
Теоретически вы могли бы это сделать.
В приложении САПР Rhinoceros для создания плагинов используется короткая версия фитона, называемая железным фитоном. Можно ли смешать эту короткую библиотеку с Delphi и создать плагин с Delphi?
да
for, in, import — ключевые слова не выделяются
Что-то не так с выделением синтаксиса. Вот что происходит с живыми демонстрациями.
Нужно ли нам добавить путь к python в параметрах проекта?
Есть несколько вариантов распространения.
что произойдет, если синтаксис неправильный?
Он предоставит обратную связь об ошибках, и вы сможете исправить это в своей программе.
1. Включите ли вы ссылку на этот простой демонстрационный пример в ссылку?
2. Могу ли я использовать это и в C ++ Builder?
Вот все образцы , и большая часть функций должна работать с C ++ Builder.
Поддерживается ли потоковая передача?
Вскоре выйдет многопоточная демонстрация.
Здравствуйте
Есть ли способ управлять разными экземплярами python из приложения delphi или это одно приложение delphi с одним экземпляром python?
Вы можете управлять этим из TPythonEngine
я могу использовать его в веб-приложении?
Теоретически. У вас есть некоторые дополнительные проблемы с веб-приложениями, поэтому вам нужно быть осторожным с вашей потоковой моделью, но если вы будете осторожны, она должна работать нормально.
Какой он хороший ведущий!
да
Будет ли это работать и с C ++ Builder?
Большинство функций должно работать с C ++ Builder.
хе-хе, я думаю, Delphi позволит создавать гораздо лучшие визуальные интерфейсы, чем tkinter
О да, я пошел и исследовал варианты Python для создания графического интерфейса, и они напомнили мне создание графического интерфейса до Delphi. Delphi великолепно добавляет графический интерфейс в приложение Python.
как обрабатываются исключения python? pyc создается при выполнении скрипта? Если нет, то второе выполнение i python быстрее, чем в delphi
Компонент перехватывает ошибки и преобразует их в исключения Delphi, чтобы вы могли их обработать.
Мне нужно реализовать Listener для Firebase, мне удалось установить python и библиотеку, но я не мог оставить работающий код python
Вы сравнивали это время Python с скомпилированным кодом Python?
Скомпилированный Python будет быстрее, чем демонстрационный, но есть и другие улучшения производительности с помощью параллельной библиотеки. Так что всегда есть варианты повышения производительности.
Мне нужно реализовать Listener для Firebase, мне удалось установить python и библиотеку, но я не мог оставить работающий код python
есть ли ограничение на импортированные библиотеки python? например, можем ли мы импортировать opencv, matplotlib, scipy, scikit?
Да, вы можете использовать все это.
Возможно, я пропустил информацию о «необходимом размере дистрибутива», который может быть включен в установку приложения delphi конечным пользователям.
около 8 МБ
Можно ли передавать переменные из Delphi в Python?
да
Поддерживают ли компоненты SynEdit / TPython__ Delphi Seattle?
да.
Очень впечатляюще! Если я правильно понял, на FreePascal / Lazarus существуют некоторые ограничения в отношении обработки изменений вариантов.
да
Собственно в этом и моя проблема — несколько вариантов перераспределения. Мне нужно найти минимальный размер для конечного пользователя.
Используйте встраиваемую версию, и она очень мала
Как Python узнает, где взять delphi_module?
В сегодняшних демонстрациях это говорится, но на следующем вебинаре мы покажем, как создавать модули для использования вне Delphi.
Могу ли я использовать взаимодействие с Python из Delphi 10.3.3?
да
Он работает и с Берлином?
да
Будет ли этот канал «Вопросы» доступен позже? Здесь есть несколько хороших моментов.
Да, я включу их в сообщение в блоге с воспроизведением
Могу ли я передать объект delphi в Python и вызвать методы объекта в Python?
да, вскоре продемонстрирую запись, но можно также использовать объекты и запись.
Удивительный
Согласовано
Было бы интересно посмотреть, как вы можете создавать библиотеки DLL в Delphi, которые вы вызываете из чистого Python; за пределами Дельфи.
Я думаю, что будет освещена вторая часть через 2 недели.
??
Когда следующий сеанс?
за две недели одновременно. Вы уже зарегистрированы
Возможна ли многопоточность?
да
Если я хочу распространить Python DLL и некоторые библиотеки вместе с моим приложением в каком-либо подкаталоге, как я могу сообщить системе, по какому пути находятся эти библиотеки?
Да, через TPythonEngine
Я действительно впечатлен выступающим и тем, как он может управлять экраном, увеличивая масштаб и переходя на следующую страницу. Как он это делает, пожалуйста?
Было бы интересно увидеть вывод для объекта delphi Ref: print (type (Ref)) print (dir (Ref)) print (help (Ref))
они типы Python
Сравнение времени выполнения python и delphi выглядит действительно неудобным для людей, отчаянно нуждающихся в этих tenorFlow, anaconda, panda и других библиотеках Python. Мне действительно нужен delphi?
Delphi упрощает создание GUI и последующий вызов библиотек Python TensorFlow и т. Д., Delphi упрощает создание GUI и последующий вызов библиотек Python TensorFlow и т. Д.
Здравствуйте! Позволяет ли эта библиотека (Python4Delphi) легко связывать и использовать модуль и библиотеку python? Numpy например?
да. Мы рассмотрим это более подробно на следующей сессии.
Можете ли вы показать пример функции Phyton Big Data, такой как SVM Support Vector Machine), которая вызывается из Delphi и возвращает результаты в Delphi?
Да, в следующем сеансе.
спасибо — это было действительно интересно
согласовано
Отличный материал!! Благодарность!
согласовано
Верное решение разбить его на две сессии! Первая часть была очень информативной, быстрой и достаточно тяжелой.
Да, мы быстро поняли, что это будет слишком много для одного сеанса. Возможно, в будущем придется проводить больше сессий.
Спасибо большое, очень интересно!
Отлично !, с нетерпением ждем следующего сеанса. Спасибо вам всем за эти огромные усилия
Я так понимаю можно использовать любую IDE? как PyCharm?
да
Распространяя эту DLL, вы можете избежать установки Python на целевой машине, верно? Насколько велика эта библиотека Python на самом деле?
Менее 8 МБ
Небольшая демонстрация FMX, пожалуйста.
У нас будет один на следующей сессии.
Спасибо, отличная демка !!!!
Delphi + Python + Docker…. это было бы интересно
Конечно, достаточно легко, Конечно, достаточно легко
можно ли использовать модуль python?
да
Джим и Кириакос:
Просто чтобы прояснить для аудитории…
«Python4Delphi» — это _не_ кросс-компилятор Python для Delphi … Вместо этого этот проект определенно разработан для _ одновременного сосуществования Delphi с Python_ в любом направлении …
Верно?
да, это верно.
Будет ли на втором вебинаре пример использования библиотеки matplotlib через Delphi?
да
Я зарегистрирован в части 1, я должен зарегистрироваться в части 2 или это происходит автоматически, для сеанса 2
Уже зарегистрирован.
Хорошая сессия! Спасибо!
Согласен, добро пожаловать.
есть справочный документ, пожалуйста?
Существует некоторая документация здесь , с 33 демок, и этот веб — семинар
Можно ли выбрать конкретную виртуальную среду, созданную conda?
да
Можно ли вернуть из функции delphi СТРОКУ в вывод python?
да
Спасибо, очень интересно.
Могу ли я получить доступ к matplotlib? Если да, то как, в отдельных окнах или встроенных в графический интерфейс, например, внутри VCL.
Присоединяйтесь к нам через 2 недели
Очень хороший материал!
согласовано
Сможем ли мы снова посмотреть этот веб-семинар позже или поделиться им с коллегой?
да
Можете ли вы передать список Python в Delphi?
конечно.
Отличный вебинар! Это открыло идеи по интеграции Python и Delphi в мои проекты. С нетерпением жду следующего вебинара.
да
Могу ли я получить доступ к объектам базы данных, таким как clientdataset, из Python?
да
Последний раз я работал над Delphi в 1995 году. P4D — хороший повод вернуться в Delphi!
да
Спасибо!
привет, d4p полностью кроссплатформенный?
да, но пока нет Python на мобильных устройствах., да, но еще нет Python на мобильных устройствах.
Могу ли я использовать Sublime Text?
конечно
Потрясающие!
Спасибо за то, что поделились / показали.
есть ли какая-либо документация по классу или ссылка, пожалуйста?
использовать источник
Отличное вступление. С нетерпением жду следующих занятий. Престижность Embarcadero за организацию этого вебинара.
Благодарность!
Джим и Кириакос: Просто чтобы прояснить для аудитории… «Python4Delphi» — это _не_ кросс-компилятор Python для Delphi … Вместо этого, этот проект определенно разработан для _ одновременного сосуществования Delphi с Python_ в любом направлении … Верно?
верный
Очень интересно. (Я использовал в своем приложении PascalScript из RemObjects).
Хорошая сессия!
Есть ли обучение по Python4Delphi?
пока нет, но я работаю над этим.
он работает на мобильной ОС? Android и IOS?
Python не работает на мобильных устройствах.
когда будет второй вебинар?
две недели.
Планируется ли опубликовать Python4Delphi через GetIt Package Manager, чтобы упростить установку?
Да.
Могу ли я получить доступ к объектам базы данных, таким как clientdataset, из Python?
да
Как можно использовать delphi из python иначе, чем проект / модуль delphi, скомпилированный в dll?
да, следующий сеанс через две недели.
Большой! Как я могу распространять пакеты Python с помощью Python dll?
Обратитесь к документации Python.
Сколько здесь посетителей, Джим?
Много.
Работал в Chrome на Mac
Хорошая вещь!
это будет та же ссылка на вебинар для части 2? Или мне нужно искать новую ссылку?
да
Спасибо:)
должно ли управление подсчетом ссылок быть ручным? могут ли будущие версии библиотеки автоматизировать это?
В предпочтительных вариантах выполняется автоматический подсчет ссылок.
нужен ли python.dll при запуске exe-файла?
да
Сколько это будет стоить?
бесплатно / с открытым исходным кодом
Можно ли передать растровые изображения, созданные Python, обратно в Delphi?
Я думаю о преобразованиях svg-> bmp и т. Д.
Теоретически
Спасибо за ответ!
Аплодисменты одного из зрителей. Вы оба делаете хорошую работу!
Будет ли P4D компилироваться в сообществе Delphi?
да
Очень круто. Отличный семинар. Спасибо, что надели это.
Очень понравилось! Открывает столько возможностей! Спасибо!
Полностью ли он совместим с кодом RAD Server, работающим в Linux Ubuntu?
да да да
Отличный вебинар! Спасибо!
играли с этим время от времени несколько лет. Можем ли мы иметь простой пример передачи массива в Python, обработки в numpy и возврата в delphi
да, буду работать над этим.
Круто! С нетерпением жду следующей сессии!
Пожалуйста, будьте здоровы и живы всем.
Благодарность
может ли он работать на Android и IOS?
еще нет
Так много интересного — вам нужна часть 3 — люди хотят большего
Сколько разработчиков участвует в этом проекте? Это необходимо для любого Delphi-разработчика «современной эпохи» !!! ??
отличная работа, спасибо за эту сессию, до встречи в следующей!
Отличный вебинар. Очень волнующе. С нетерпением жду части 2. Именно то, что мы искали.
Отличный материал! Я определенно собираюсь использовать P4D. Спасибо и привет из Израиля
поддержка Python4Delphi с несколькими устройствами (FMX)?
да, macOS, Linux и Windows. На мобильных устройствах пока нет Python.
С нетерпением жду возможности увидеть его в Get It Package Manager в ближайшем будущем.
Будем работать над этим.
Я использую python на AWS. Могу ли я использовать там объект Delphi?
если развернешь там, то да. Просто разверните модуль linux.
Замечательная демка. Я с нетерпением жду возможности узнать больше.
Да, пожалуйста, больше времени на библиотеки Python !!!
Сделаю
15 лет использования delphi, 10 лет использования python… Спасибо за вашу работу !!!
должно ли управление подсчетом ссылок быть ручным? Могут ли будущие версии библиотеки p4d автоматизировать это?
Когда вы используете компоненты оболочки высокого уровня, он автоматически обрабатывает подсчет ссылок.
Что вы имеете в виду, когда к функциям Python обращаются в низкоуровневом коде из Dephi?
Delphi может напрямую вызывать функции Python.
Что вы можете сказать, каковы основные преимущества использования P4D по сравнению с разработкой проектов машинного обучения на чистом Python?
Используйте Delphi для пользовательского интерфейса или других интеграций
Как мы можем помочь; тебе нравятся запросы на вытягивание? Или сначала обсудите предложения?
Как бы вы ни захотели принять участие — это здорово!
Я много чего проделал с Delphi для Windows и Linux в AWS.
Ах, отлично!
Как вы думаете, вы заменили Ткинтера? пожалуйста скажи да
Это, безусловно, один из вариантов использования.
Именно то, что я хотел предложить!
Когда я компилирую demo01, он показывает ошибку, не могу открыть DLL «python32.dll», я не могу найти dll в исходном коде, как это исправить?
Сначала вам нужно установить Python и убедиться, что разрядность Python соответствует разрядности вашего приложения (32 против 64 бит), вы можете установить оба.
Может быть, стоит организовать канал в Discord после успешного запуска сообщества Bold? или подобное уже есть?
Конечно, есть на что посмотреть.
Могу ли я обрабатывать ошибки delphi из Python?
да
если у вас есть компоненты высокого уровня, зачем вам нужны компоненты низкого уровня?
Компоненты высокого уровня используют RTTI, поэтому компоненты низкого уровня дают вам немного больше контроля и позволяют удалить накладные расходы RTTI.
Пожалуйста, перечислите классы высокого и низкого уровня, я не уверен, какие именно.
TPyDelphiWrapper — это компонент высокого уровня.
Мне нужно продолжать! Спасибо, народ! Увидимся!
Могу ли я отлаживать код Python из Delphi?
Вы можете отлаживать код Python из среды IDE Delphi, но вы можете использовать PyScripter для отладки кода. Ваше приложение Delphi
Можем ли мы создать образец модуля, разработанный в Delphi, и установить его с помощью PIP?
Я пытаюсь скомпилировать пакет для Delphi 10.4, но в модуле PythonAction много ошибок из-за неправильного использования строк Ansi и Unicode… это в процессе?
Можно ли разделить память между Delphi и Python
Очень интересно, спасибо. С нетерпением жду 2-го
действительно отличная информация, большое спасибо! увидимся в следующий раз
Будет ли охвачена автоматизация тестирования Python в следующий раз?
когда Java в Delphi?
Благодарность!
Спасибо ! Прекрасная работа !
Спасибо, ребята, очень признательны !!!
Спасибо!
Действительно полезно
Спасибо
Спасибо
Огромное спасибо!
Gracias a ustedes. Esperamos ansioso la segunda parte
Gnostice Document Studio Delphi ist eine Komponenten-Suite für die Dokumentverarbeitung in mehreren Formaten für Delphi und C ++ Builder. Gnostice Document Studio enthält die folgenden Funktionen:
Im Promo Pack ist die Gnostice Document Studio Embarcadero Edition enthalten . Die Embarcadero Edition enthält die voll ausgestatteten Komponenten VCL und FMX Document Viewer sowie Document Printer zum Anzeigen und Drucken von PDF-Dokumenten und Bilddateien. Zu den VCL-Zielplattformen gehören Win32 und Win64. Zu den FMX-Zielplattformen gehören Win32, Win64, macOS, iOS und Android.
Gnostice Document Studio Delphi ist in 100% Object Pascal für VCL und FireMonkey geschrieben. Es kann alle unterstützten Formate verarbeiten und anzeigen, ohne dass externe Software wie Microsoft Word, Open XML SDK, Adobe PDF-Bibliothek oder GhostScript erforderlich ist.
Update : In Blog-Posts wurden ursprünglich die falschen Edition-Funktionen aufgelistet.
Gnostice Document Studio Delphi — это набор компонентов многоформатной обработки документов для Delphi и C ++ Builder. Gnostice Document Studio включает в себя следующие функции:
В рекламный пакет входит Gnostice Document Studio Embarcadero Edition . Embarcadero Edition включает полнофункциональные компоненты VCL и FMX Document Viewer и Document Printer для просмотра и печати PDF-документов и файлов изображений. Целевые платформы VCL включают Win32 и Win64. Целевые платформы FMX включают Win32, Win64, macOS, iOS и Android.
Gnostice Document Studio Delphi написана на 100% Object Pascal как для VCL, так и для FireMonkey. Он может обрабатывать и отображать все поддерживаемые форматы, не требуя внешнего программного обеспечения, такого как Microsoft Word, Open XML SDK, Adobe PDF library или GhostScript.
Обновление : изначально в сообщении в блоге были указаны неправильные функции выпуска.
Gnostice Document Studio Delphi é um conjunto de componentes de processamento de documentos multiformato para Delphi e C ++ Builder. O Gnostice Document Studio inclui os seguintes recursos:
Incluído no Promo Pack está o Gnostice Document Studio Embarcadero Edition . O Embarcadero Edition inclui os componentes VCL e FMX Document Viewer e Document Printer completos para visualizar e imprimir documentos PDF e arquivos de imagem. As plataformas de destino VCL incluem Win32 e Win64. As plataformas de destino FMX incluem Win32, Win64, macOS, iOS e Android.
Gnostice Document Studio Delphi é escrito em 100% Object Pascal para VCL e FireMonkey. Ele pode processar e exibir todos os formatos suportados sem a necessidade de software externo, como Microsoft Word, Open XML SDK, biblioteca Adobe PDF ou GhostScript.
Atualização : a postagem do blog originalmente tinha os recursos de edição incorretos listados.
Gnostice Document Studio Delphi es una suite de componentes de procesamiento de documentos multiformato para Delphi y C ++ Builder. Gnostice Document Studio incluye las siguientes características:
En el paquete promocional se incluye la edición Embarcadero de Gnostice Document Studio . La edición Embarcadero incluye los componentes VCL y FMX Document Viewer e Impresora de documentos con todas las funciones para ver e imprimir documentos PDF y archivos de imagen. Las plataformas de destino de VCL incluyen Win32 y Win64. Las plataformas de destino FMX incluyen Win32, Win64, macOS, iOS y Android.
Gnostice Document Studio Delphi está escrito en 100% Object Pascal tanto para VCL como para FireMonkey. Puede procesar y mostrar todos los formatos admitidos sin necesidad de software externo como Microsoft Word, Open XML SDK, biblioteca de Adobe PDF o GhostScript.
Actualización : la publicación de blog originalmente incluía las funciones de edición incorrectas.
Wed Sep 23 2020 17:19:14 GMT+0700 (Western Indonesia Time)
TL;DR – Se estiver sem muito tempo… siga direto para o link do GitHub ao final do artigo
Existem várias abordagens possíveis para o controle do teclado em aplicações mobile, mas na prática, podemos considerar duas principais linhas de pensamento:
Aplicar um padrão de interface de usuário onde apenas a parte superior da área útil da tela é utilizada para entrada de dados, de maneira que o teclado nunca se apresente por sobre campos de entrada de dados ou informações importantes. Particularmente (quando possível) parece-me a abordagem mais confortável para o usuário final
Utilizar toda a área útil da tela para a entrada de dados, e neste caso, manter o controle sobre a exibição dos campos e do teclado em sincronia, tornando a experiência do usuário tão confortável quanto possível
Caso você opte pela opção #2, trago aqui algumas possibilidades para facilitar o seu desenvolvimento.
A primeira delas, a qual já utilizei em alguns vídeos do Delphi Academy, é uma unit/classe, a qual adicionada ao seu projeto, assume o controle do posicionamento visual dos controles de entrada de dados, efetuando seu deslocamento em função da posição do teclado. A versão mais atualizada deste código pode ser encontrada no GitHub, como parte de um projeto Open Source maior:
E finalmente, estou compartilhando neste post uma abordagem (a qual não depende de units ou classes externas) baseada em um dos exemplos que acompanham o Delphi e o RAD Studio. Esta abordagem utiliza na base de sua implementação o TVertScrollBox, e encontra-se documentada abaixo:
Com o objetivo de tornar a técnica utilizada acima algo simples de se aplicar em um projeto real, estou compartilhando abaixo em meu GitHub dois casos de uso distintos.
O primeiro deles faz uso do conceito de herança visual, sendo que todo o código relacionado ao controle do teclado passa a residir na classe/form base, e suas heranças naturalmente passaram a assumir este comportamento de maneira automática. Isso permite até que você o aplique em um projeto pré-existente sem uma grande quantidade de refactorings.
O segundo exemplo utiliza a mesma técnica, porém apenas no formulário principal, e considera que todos as demais interfaces visuais da app (forms) serão na verdade layouts renderizados em um container da interface principal.
Deixo aqui o código de ambos para que possam explorar e eventualmente adotar/expandir o conceito:
Wed Sep 23 2020 17:12:33 GMT+0700 (Western Indonesia Time)
During this Corona Pandemic, lots of people have decided to use their free time at home to do studies online. According to TheGuardian“increasing numbers of people are using the time to build their skillset, with an upsurge in enrolments on online learning platforms”.
I also decided to invest my time to learn new subjects online. As I wrote in a previous post about Continuous Learning:“Everything we know, including our professional skills, is rapidly becoming obsolete. This means that it’s not enough to work. We must be constantly updating our knowledge and acquiring new skills.”
After some investigation, my choice was ThePowerMBA. My background is in the field of Computer Sciences, but as an entrepreneur and CEO of my own startup company (KashKlik) it is important for me to learn more about Business Management, and in particular the topics that are more relevant for startup companies.
The Curriculum of ThePowerMBA has lots of subjects which are extremely relevant for startups:
Business Model Innovation
The Lean Startup
Strategy & Business Fundamentals
The Power of Being a (Real) Marketer
Entrepreneurship
Leadership
Management Skills & Tools
Finance & Accounting
Disruptive Tech in Business
I think it is very important for new entrepreneurs to learn all these topics, which will certainly have a direct and immediate practical application in their startup companies. As I wrote in a previous post: “When you are the founder of a startup company you have to do many things that you have never done before, and many of these things are difficult. Actually, most things you are doing as an entrepreneur would have been difficult even for someone who has experience doing them.”
For example, the first module about Business Model Innovation covers the Blue Ocean Strategy (among other things). I read the Blue Ocean book when we were planning the features of our influencer marketing platform, and it was really inspiring. I have recently published a post in which I describe our experience applying the principles of the Blue Ocean Strategy at KashKlik.
Another topic I’m enthusiastic about is the Lean Startup. I read the Lean Startup book by Eric Ries several years ago, and since then the Build-Measure-Learn feedback loop has become an integral and essential part of every new project I execute. I’m excited that Eric himself is a contributor to the materials in ThePowerMBA classes.
But of course the ThePowerMBA curriculum also has several topics that I really need to learn more about. For example the module about Strategy & Business Fundamentals covers Industry Analysis, Competitive Strategies, Marketing Basics and Corporate Growth Strategies. These are very interesting subjects that I never really had the opportunity to study, because all my academic formation is in the field of Computer Sciences. In practice, I’m a technical CEO, and thus I lack this business background.
Another module which I’m sure will be very important for me is the one about Finance & Accounting. This module covers Accounting Fundamentals, Financial Statements and Analysis and Valuation (Investments and Companies). Unfortunately I still feel that I’m very ignorant about these subjects, so this will be a great opportunity for me to learn more about them. Of course to perform well as the CEO of a startup company I must also be able to understand all the financial aspects. This is even more important in our case, because KashKlik is already a global company, doing business with customers in several continents, and with diverse sources of revenue.
I’m excited to be learning these new disciplines, but what is even better is that, in the case of ThePowerMBA, I’m sure that I’m going to put these new skills in practice. I believe that if we really want to understand a new subject, we must be able to apply the new concepts that we are learning. Thus it’s simply fantastic that I’m going to do a course with so many relevant topics that I will be able to immediately use in my own startup company.
I decided to share with you (my readers) the main insights I will get from this course, and thus in the next months I will be posting here regularly about what I’ve learned. I’m sure it will be a great way to grow while we must stay mostly at home.
Tue Sep 22 2020 22:01:00 GMT+0700 (Western Indonesia Time)
Опубликовав исходный код Bold для Delphi с лицензией MIT на https://github.com/Embarcadero/BoldForDelphi, Embarcadero официально сделал библиотеку Bold для Delphi проектом с открытым исходным кодом.
Что жирное (и немного истории)
Полужирный шрифт — это инструмент в пространстве MDA (Model Driven Architecture), который позволяет вам начать с UML-модели вашего приложения и набора бизнес-правил, написанных на языке высокого уровня, и «выполнить» модель после создания графического пользовательского интерфейса. для этого.
Bold включает сложный объектно-реляционный слой сопоставления, возможность отображать данные в несколько форматов, синхронизацию изменений и многое другое. Он включает в себя большое количество интегрированных в IDE инструментов и опций для работы с внешним ПО для моделирования UML.
Фреймворк и библиотека Bold были первоначально созданы Bold Soft, позже приобретены Borland и проданы как надстройка к Delphi в сроки Delphi 6 и 7. В последующие годы разработка Bold была прекращена, чтобы сосредоточиться на структуре ECO (Enterprise Core Objects) для платформы .NET. Позже ECO была продана Borland компании CapableObjects.
Некоторые клиенты оставались активными на Bold и обновляли его для работы с самыми последними версиями Delphi, но не могли выпускать и делиться своими обновлениями с другими разработчиками из-за проприетарной лицензии.
Как уже упоминалось, последняя внутренняя версия исходного кода Bold для Delphi теперь выпущена на GitHub под лицензией MIT.
Обратите внимание, что это не обновленная версия. Выпущенный код должен работать с Delphi 7 и Delphi 2006 и не будет работать с версией продукта Unicode (начиная с версии Delphi 2009).
Если вам интересно, для чего нужен этот старый код, основная цель — побудить активных пользователей библиотеки делиться своими более новыми версиями, которые работают с Delphi 10.4 Sydney. Это давняя просьба активных клиентов Bold.
Выпуск версии, которая работает с Delphi 10.4 Sydney, не произойдет сразу, поскольку публикация изменений будет зависеть от активных пользователей Bold. Публикация внутреннего кода под лицензией с открытым исходным кодом была важна для того, чтобы другие могли начать совместную работу над более новой версией.
Общественный диск
Embarcadero не планирует и дальше принимать непосредственное участие в обновлении и сопровождении исходного кода Bold для Delphi, кроме как помогать сообществу Bold в организации и продвижении их усилий.
Если вы заинтересованы в участии и помощи, дайте мне знать (по электронной почте или в комментариях), и я свяжу вас с разработчиками, которые начинают работу сообщества.
Tue Sep 22 2020 21:57:54 GMT+0700 (Western Indonesia Time)
Ao publicar o código-fonte do Bold for Delphi com uma licença do MIT em https://github.com/Embarcadero/BoldForDelphi, a Embarcadero tornou oficialmente a biblioteca Bold for Delphi um projeto de código aberto.
O que é ousado (e um pouco de história)
Bold é uma ferramenta no espaço MDA (Model Driven Architecture), que permite que você comece com um modelo UML de seu aplicativo e um conjunto de regras de negócios escritas em uma linguagem de alto nível e “execute” o modelo após criar uma interface gráfica de usuário para isso.
O Bold inclui uma sofisticada camada de mapeamento objeto-relacional, capacidade de mapear dados em vários formatos, sincronização de alterações e muito mais. Inclui uma grande quantidade de ferramentas e opções integradas IDE para trabalhar com software de modelagem UML externo.
A estrutura e a biblioteca do Bold foram originalmente construídas pela Bold Soft, posteriormente adquirida pela Borland, e vendida como um complemento para o Delphi no Delphi 6 e 7 timeframe. Nos anos seguintes, o desenvolvimento do Bold foi descontinuado, para focar no framework ECO (Enterprise Core Objects) para a plataforma .NET. ECO foi posteriormente vendido pela Borland para CapableObjects.
Vários clientes permaneceram ativos no Bold e o atualizaram para funcionar com as versões mais recentes do Delphi, mas não puderam lançar e compartilhar suas atualizações com outros desenvolvedores devido à licença proprietária.
Como mencionado, a última versão interna do código-fonte do Bold for Delphi foi lançada no GitHub sob uma licença do MIT.
Observe que esta não é uma versão atualizada. O código lançado deve funcionar com Delphi 7 e Delphi 2006, e não funcionará com uma versão Unicode do produto (desde a versão Delphi 2009).
Se você está se perguntando para que serve este código antigo, o objetivo principal é encorajar os clientes ativos na biblioteca a compartilhar suas versões mais recentes, que funcionam com Delphi 10.4 Sydney. Este tem sido um pedido antigo dos clientes ativos da Bold.
O lançamento de uma versão que funciona com o Delphi 10.4 Sydney não vai acontecer imediatamente, pois vai depender de usuários ativos do Bold para publicar suas alterações. Publicar o código interno sob uma licença de código aberto foi importante para possibilitar que outros começassem a trabalhar juntos em uma versão mais recente.
The Community Drive
A Embarcadero não planeja permanecer diretamente envolvida na atualização e manutenção do código-fonte do Bold for Delphi, a não ser ajudar a comunidade Bold a organizar e promover seus esforços.
Se você estiver interessado em se envolver e ajudar, por favor me avise (por e-mail ou comentário) e posso colocá-lo em contato com os desenvolvedores que estão iniciando o esforço da comunidade.
Tue Sep 22 2020 21:57:12 GMT+0700 (Western Indonesia Time)
Al publicar el código fuente de Bold para Delphi con una licencia del MIT en https://github.com/Embarcadero/BoldForDelphi, Embarcadero ha convertido oficialmente la biblioteca Bold para Delphi en un proyecto de código abierto.
Qué es audaz (y algo de historia)
Bold es una herramienta en el espacio MDA (Model Driven Architecture), que le permite comenzar con un modelo UML de su aplicación y un conjunto de reglas comerciales escritas en un lenguaje de alto nivel y “ejecutar” el modelo después de crear una interfaz gráfica de usuario. para ello.
Bold incluye una capa sofisticada de mapeo relacional de objetos, capacidad para mapear datos en múltiples formatos, sincronización de cambios y mucho más. Incluye una gran cantidad de herramientas integradas IDE y opciones para trabajar con software de modelado UML externo.
El marco y la biblioteca de Bold fueron originalmente construidos por Bold Soft, luego adquiridos por Borland, y vendidos como un complemento de Delphi en el plazo de Delphi 6 y 7. En los años siguientes, se interrumpió el desarrollo de Bold para centrarse en el marco ECO (Enterprise Core Objects) para la plataforma .NET. Posteriormente, Borland vendió ECO a CapableObjects.
Varios clientes permanecieron activos en Bold y lo actualizaron para que funcione con las versiones más recientes de Delphi, pero no pudieron publicar y compartir sus actualizaciones con otros desarrolladores debido a la licencia propietaria.
Como se mencionó, la última versión interna del código fuente de Bold para Delphi ahora se ha lanzado en GitHub bajo una licencia del MIT.
Tenga en cuenta que esta no es una versión actualizada. El código publicado debería funcionar con Delphi 7 y Delphi 2006, y no funcionará con una versión Unicode del producto (desde la versión Delphi 2009).
Si se pregunta cuál es el uso de este código antiguo, el objetivo principal es animar a los clientes activos en la biblioteca a compartir sus versiones más recientes, que funcionan con Delphi 10.4 Sydney. Esta ha sido una solicitud de larga data de los clientes activos de Bold.
El lanzamiento de una versión que funcione con Delphi 10.4 Sydney no va a suceder de inmediato, ya que dependerá de los usuarios activos de Bold para publicar sus cambios. Publicar el código interno con una licencia de código abierto era importante para que otros pudieran empezar a trabajar juntos en una versión más reciente.
La unidad comunitaria
Embarcadero no planea permanecer directamente involucrado en la actualización y mantenimiento del código fuente de Bold para Delphi, más allá de ayudar a la comunidad Bold a organizar y promover su esfuerzo.
Si está interesado en participar y ayudar, hágamelo saber (por correo electrónico o comentario) y puedo ponerlo en contacto con los desarrolladores que están comenzando el esfuerzo de la comunidad.
Преимущества подписки на обновления RAD Studio Update Subscription продолжают расширяться. В дополнение к многочисленным БЕСПЛАТНЫМ компонентам и инструментам, доступным клиентам Подписки на обновления, мы хотим выделить несколько появившихся в сентябре интересных возможностей, связанных с релизами 10.4 / 10.4.1.
Пользовательские VCL-стили Windows с поддержкой HighDPI.
В 10.4 мы значительно расширили архитектуру VCL Styles для поддержки мониторов с высоким уровнем DPI и 4K. Все элементы управления пользовательским интерфейсом на форме VCL теперь автоматически масштабируются для надлежащего разрешения монитора, на котором отображается форма. Каждый элемент пользовательского интерфейса может быть выбран из библиотеки масштабируемых версий и применен для любого DPI, в результате чего на всех мониторах четко показываются все элементы пользовательского интерфейса.
Следующие 13 пользовательских стилей VCL были обновлены для полной поддержки высокого уровня DPI в приложениях VCL:
Calypso
Stellar
Wedgewood Light
Material Oxford Blue
Puerto Rico
Material Patterns Blue
Windows 10 Modern Malibu
Windows 10 Modern Blue Whale
Windows 10 Modern Clear Day
Windows 10 Modern Black Pearl
Flat UI Light
Lucky Point
Zircon
Параллельный отладчик
Современные приложения работают не только в одном потоке — они распределены по главному потоку пользовательского интерфейса и нескольким параллельным потокам, все они взаимодействуют между собой. Тем не менее, большинство IDE построены на взаимодействии с одним потоком за раз при отладке, или имеют отладочные элементы управления, которые даже не подозревают о том, что может существовать больше одного потока.
Взаимодействие с потоками при отладке может быть сложным, действительно сложным… и у нас есть решение: новое параллельное расширение RAD Studio, предназначенное для понимания, что делает ваше многопоточное приложение, и управления им. Визуализируйте независимо стеки вызовов потоков. Наблюдайте за несколькими потоками, указанными в строке редактора кода. Контролируйте выполнение в каждом потоке. И многое другое! Это увлекательное новое расширение скоро появится исключительно для пользователей Подписки на обновления, использующих RAD Studio 10.4.1.
TwineCompile: ускорение сборки на C++
C++ действительно может медленно компилироваться, причем для всех C++ IDE — и TwineCompile является ответом. Это удивительное расширение C++Builder распараллеливает сборку C++ — проектов, расширяя ее на количество ядер в машине — делая сборку проекта короче наполовину, на четверть, а то и меньше.
Это расширение является одним из лучших расширений производительности, доступных для разработки на C++. В зависимости от размера приложения можно сэкономить час и более в день — огромная экономия времени для всей команды разработчиков!
Есть три коротких двухминутных видеоролика, представляющие TwineCompile и то, как им пользоваться: возможно, лучшие шесть минут, которые вы могли бы потратить сегодня на улучшение для вашей C++ команды.
Вы можете получить TwineCompile прямо сейчас для C++Builder при наличии активной Подписки на Обновления — в том числе и для пользователей редакции Professional!
Обновленный FMX Linux
Мы также недавно обновили пакет FMXLinux для Delphi в GetIt. Последняя версия имеет полную поддержку 10.4.1 и включает ряд улучшений качества.
Sat Sep 19 2020 22:02:16 GMT+0700 (Western Indonesia Time)
Зачем разработчику Delphi добавлять Python в свой набор инструментов? Все дело в доступе к библиотеке и возможности создания сценариев. Библиотека Python4Delphi (P4D) с открытым исходным кодом от Кириакоса Влахоса, автора популярной среды разработки Python PyScripter, позволяет вам как разработчику Delphi использовать всю коллекцию библиотек Python непосредственно из Delphi. Он также упрощает выполнение сценариев Python, создание новых модулей Python и новых типов Python непосредственно из вашего приложения Delphi. Дайте своим приложениям Delphi лучшее из обоих миров!
Присоединяйтесь к автору Python4Delphi Кириакосу Влахосу и адвокату разработчиков Embarcadero Джиму МакКиту на этом вебинаре из 2 частей, чтобы узнать, как использовать Python в ваших приложениях Delphi.
TensorFlow и другие библиотеки используют Numpy внутри для выполнения нескольких операций с тензорами. Интерфейс массива — лучшая и самая важная особенность Numpy.
В частности, он предлагает структуры данных и операции для управления числовыми таблицами и временными рядами.
Название происходит от термина «панельные данные», эконометрического термина для наборов данных, которые включают наблюдения за несколько периодов времени за одними и теми же людьми.
Он включает различные алгоритмы классификации, регрессии и кластеризации, включая вспомогательные векторные машины, случайные леса, повышение градиента, k-средних и DBSCAN.
Набор библиотек и программ для символьной и статистической обработки естественного языка (NLP) для английского языка
Предназначен для поддержки исследований и преподавания в области НЛП или тесно связанных областей, включая эмпирическую лингвистику, когнитивную науку, искусственный интеллект, поиск информации и машинное обучение.
Используется в естественных науках, математике и инженерии
Содержит модули для оптимизации, линейной алгебры, интеграции, интерполяции, специальных функций, БПФ, обработки сигналов и изображений, решателей ODE и других задач, распространенных в науке и технике.
Matplotlibи Seabornдля построения графиков и визуализации статистических данных
Sat Sep 19 2020 22:01:55 GMT+0700 (Western Indonesia Time)
Por que um desenvolvedor Delphi deseja adicionar Python ao seu conjunto de ferramentas? É tudo sobre acesso à biblioteca e capacidade de script. A biblioteca de código aberto Python4Delphi (P4D) de Kiriakos Vlahos, autor do popular PyScripter Python IDE, permite que você, como desenvolvedor Delphi, aproveite toda a coleção de bibliotecas Python diretamente do Delphi. Também torna fácil executar scripts Python, criar novos módulos Python e novos tipos Python diretamente de seu aplicativo Delphi. Dê aos seus aplicativos Delphi o melhor dos dois mundos!
Junte-se ao autor do Python4Delphi, Kiriakos Vlahos, e ao Embarcadero Developer Advocate Jim McKeeth, neste webinar de 2 partes para aprender como aproveitar o Python em seus aplicativos Delphi.
O TensorFlow e outras bibliotecas usam o Numpy internamente para realizar várias operações em Tensores. A interface de array é o melhor e mais importante recurso do Numpy.
Em particular, ele oferece estruturas de dados e operações para manipular tabelas numéricas e séries temporais.
O nome é derivado do termo “dados de painel”, um termo econométrico para conjuntos de dados que incluem observações ao longo de vários períodos de tempo para os mesmos indivíduos.
Possui vários algoritmos de classificação, regressão e agrupamento, incluindo máquinas de vetores de suporte, florestas aleatórias, aumento de gradiente, k-médias e DBSCAN.
Um conjunto de bibliotecas e programas para processamento de linguagem natural simbólica e estatística (PNL) para inglês
Destina-se a apoiar a pesquisa e o ensino em PNL ou áreas estreitamente relacionadas, incluindo linguística empírica, ciência cognitiva, inteligência artificial, recuperação de informações e aprendizado de máquina
Contém módulos para otimização, álgebra linear, integração, interpolação, funções especiais, FFT, processamento de sinais e imagens, solucionadores de ODE e outras tarefas comuns na ciência e engenharia.
Matplotlib& Seabornpara plotagem e visualização de dados estatísticos
Sat Sep 19 2020 22:01:19 GMT+0700 (Western Indonesia Time)
¿Por qué un desarrollador de Delphi querría agregar Python a su cinturón de herramientas? Se trata de acceso a la biblioteca y capacidad de escritura. La biblioteca de código abierto Python4Delphi (P4D) de Kiriakos Vlahos, autor del popular PyScripter Python IDE, le permite, como desarrollador de Delphi, aprovechar toda la colección de bibliotecas de Python directamente desde Delphi. También facilita la ejecución sencilla de scripts de Python, la creación de nuevos módulos de Python y nuevos tipos de Python directamente desde su aplicación Delphi. ¡Dé a sus aplicaciones Delphi lo mejor de ambos mundos!
Únase al autor de Python4Delphi, Kiriakos Vlahos, y al promotor de desarrolladores de Embarcadero, Jim McKeeth, en este seminario web de 2 partes para aprender cómo aprovechar Python en sus aplicaciones Delphi.
Actualización: Debido a que hubo tanto interés, estamos haciendo que este sea un seminario web de dos partes: Combinando las fortalezas de Delphi y Python.
Uso de bibliotecas y objetos de Python en código Delphi
Análisis de datos basado en Python en aplicaciones Delphi
TensorFlow, desarrollado por Google en colaboración con Brain Team, se utiliza en casi todas las aplicaciones de Google para el aprendizaje automático.
Las redes neuronales se pueden expresar fácilmente como gráficos computacionales utilizando TensorFlow como una serie de operaciones en tensores.
TensorFlow y otras bibliotecas usan Numpy internamente para realizar múltiples operaciones en tensores. La interfaz de matriz es la mejor y más importante característica de Numpy.
En particular, ofrece estructuras de datos y operaciones para manipular tablas numéricas y series de tiempo.
El nombre se deriva del término “datos de panel”, un término econométrico para conjuntos de datos que incluyen observaciones durante múltiples períodos de tiempo para las mismas personas.
Cuenta con varios algoritmos de clasificación, regresión y agrupación que incluyen máquinas de vectores de soporte, bosques aleatorios, aumento de gradiente, k-medias y DBSCAN.
Un conjunto de bibliotecas y programas para el procesamiento del lenguaje natural (PNL) simbólico y estadístico para inglés
Destinado a apoyar la investigación y la enseñanza en PNL o áreas estrechamente relacionadas, incluida la lingüística empírica, la ciencia cognitiva, la inteligencia artificial, la recuperación de información y el aprendizaje automático.
Contiene módulos para optimización, álgebra lineal, integración, interpolación, funciones especiales, FFT, procesamiento de señales e imágenes, solucionadores de ODE y otras tareas comunes en ciencia e ingeniería.
Matplotlib& Seabornpara el trazado y la visualización de datos estadísticos
Pillow& MoviePypara procesamiento de imágenes y videos
Thu Sep 17 2020 22:18:20 GMT+0700 (Western Indonesia Time)
Преимущества подписки на обновления RAD Studio продолжают расширяться. В дополнение к множеству БЕСПЛАТНЫХ компонентов и инструментов, доступных клиентам по подписке на обновления, мы хотим выделить несколько интересных функций сентября, связанных с выпусками 10.4 / 10.4.1.
Пользовательские стили Windows для VCL с поддержкой HighDPI
В версии 10.4 мы значительно расширили архитектуру стилей VCL для поддержки мониторов с высоким разрешением и разрешением 4K. Все элементы управления пользовательского интерфейса в форме VCL теперь автоматически масштабируются для надлежащего разрешения монитора, на котором отображается форма. Каждый элемент пользовательского интерфейса можно выбрать из библиотеки многомасштабных версий и масштабировать до любого DPI, в результате чего элементы пользовательского интерфейса будут четкими на всех мониторах.
Следующие 13 пользовательских стилей VCL были обновлены для полной поддержки High DPI с вашими приложениями VCL:
Калипсо
Звездный
Веджвуд Лайт
Материал Oxford Blue
Пуэрто-Рико
Материал Узоры Синий
Windows 10 Современный Малибу
Windows 10 Современный синий кит
Windows 10 Modern Clear Day
Windows 10 Modern Black Pearl
Плоский свет пользовательского интерфейса
Удачная точка
Циркон
Параллельный отладчик
Современные приложения не просто выполняются в одном потоке — они распределены по основному потоку пользовательского интерфейса и нескольким параллельным потокам, которые взаимодействуют друг с другом. Тем не менее, большинство IDE построены на взаимодействии с одним потоком за раз при отладке или имеют элементы управления отладкой, которые даже не знают, что может существовать больше потоков.
Отладка взаимодействия потоков может быть сложной, очень сложной … и у нас есть решение: новое параллельное расширение для RAD Studio, предназначенное для понимания и управления тем, что делает ваше многопоточное приложение. Визуализируйте стеки вызовов потоков параллельно. Просмотрите несколько потоков, указанных в редакторе кода. Управление выполнением для каждого потока. И больше! Это захватывающее новое расширение скоро появится исключительно для пользователей подписки на обновления, использующих RAD Studio 10.4.1.
TwineCompile: ускорение сборки на C ++
C ++ может медленно компилироваться для всех IDE C ++, и TwineCompile — это ответ. Это удивительное расширение C ++ Builder распараллеливает сборки C ++, ускоряя их за счет количества ядер на вашем компьютере, благодаря чему сборка вашего проекта занимает половину, четверть или даже меньше времени.
Это дополнение — одно из лучших расширений производительности, доступных для разработки на C ++. В зависимости от размера вашего приложения можно сэкономить час или больше в день — огромная экономия времени для всей вашей команды разработчиков!
Есть три коротких двухминутных видеоролика о TwineCompile и о том, как его использовать: вероятно, лучшие шесть минут, которые вы могли бы потратить сегодня на улучшение вещей для вашей команды C ++.
Вы можете получить TwineCompile для C ++ Builder прямо сейчас с подпиской на обновления, в том числе для пользователей версии Professional!
Обновленный FMX Linux
Мы также недавно обновили пакет FMXLinux для Delphi в GetIt. Последняя версия полностью поддерживает 10.4.1 и включает ряд улучшений качества.
Thu Sep 17 2020 22:17:57 GMT+0700 (Western Indonesia Time)
Os benefícios da assinatura de atualização do RAD Studio continuam a se expandir. Além de vários componentes e ferramentas GRATUITOS disponíveis para clientes de Assinatura de Atualização, queremos destacar vários recursos interessantes para setembro relacionados às versões 10.4 / 10.4.1.
Estilos de Windows VCL prontos para HighDPI personalizados
Em 10.4, estendemos significativamente a arquitetura de estilos VCL para suportar monitores de alto DPI e 4K. Todos os controles da IU no formulário VCL agora são dimensionados automaticamente para a resolução adequada do monitor no qual o formulário é exibido. Cada elemento de IU pode ser selecionado em uma biblioteca de versões em várias escalas e escalado para qualquer DPI, resultando em elementos de IU nítidos em todos os monitores.
Os 13 estilos VCL personalizados a seguir foram atualizados para oferecer suporte total a Alta DPI com seus aplicativos VCL:
Calypso
Estelar
Wedgewood Light
Material Oxford Blue
Porto Rico
Padrões de Materiais Azul
Windows 10 Modern Malibu
Windows 10 Modern Blue Whale
Dia claro moderno do Windows 10
Windows 10 Modern Black Pearl
Flat UI Light
Lucky Point
Zircão
Depurador Paralelo
Os aplicativos de hoje não são executados apenas em um thread – eles estão espalhados pelo thread de IU principal e vários threads paralelos, todos interagindo No entanto, a maioria dos IDEs são construídos em torno da interação com um thread por vez durante a depuração, ou têm controles de depuração que nem mesmo estão cientes de que mais threads podem existir.
Depurar interações de thread pode ser difícil, realmente difícil … e nós temos a solução: uma nova extensão paralela para RAD Studio projetada para entender e controlar o que seu aplicativo multi-threaded está fazendo. Visualize pilhas de chamadas de thread em paralelo. Veja vários threads indicados em linha no editor de código. Controle a execução por thread. E mais! Esta nova extensão empolgante chegará em breve exclusivamente para clientes de Assinatura de Atualização usando RAD Studio 10.4.1.
TwineCompile: acelerar compilações C ++
C ++ pode ser lento para compilar, para todos os IDEs C ++ – e TwineCompile é a resposta. Esta incrível extensão C ++ Builder paraleliza compilações C ++, acelerando-as pelo número de núcleos em sua máquina – tornando a compilação de seu projeto pela metade, um quarto ou até menos tempo.
Este add-on é uma das melhores extensões de produtividade disponíveis para desenvolvimento C ++. Dependendo do tamanho do seu aplicativo, é possível economizar uma hora ou mais por dia – uma grande economia de tempo para toda a sua equipe de desenvolvimento!
Existem três vídeos curtos de dois minutos que apresentam TwineCompile e como usá-lo: provavelmente os melhores seis minutos que você poderia gastar hoje melhorando as coisas para sua equipe C ++.
Você pode obter TwineCompile agora para C ++ Builder com sua assinatura de atualização – incluindo para clientes da edição Professional!
FMX Linux atualizado
Também atualizamos recentemente o pacote FMXLinux para Delphi no GetIt. A versão mais recente tem suporte total para 10.4.1 e inclui uma série de melhorias de qualidade.
Thu Sep 17 2020 22:02:32 GMT+0700 (Western Indonesia Time)
Los beneficios de la suscripción a la actualización de RAD Studio continúan expandiéndose. Además de los múltiples componentes y herramientas GRATUITOS disponibles para los clientes de la suscripción de actualización, queremos destacar varias características interesantes para septiembre relacionadas con las versiones 10.4 / 10.4.1.
Estilos de Windows VCL personalizados preparados para HighDPI
En la versión 10.4, ampliamos significativamente la arquitectura de estilos VCL para admitir monitores de alto DPI y 4K. Todos los controles de IU en el formulario VCL ahora se escalan automáticamente para la resolución adecuada del monitor en el que se muestra el formulario. Cada elemento de la interfaz de usuario se puede seleccionar de una biblioteca de versiones de múltiples escalas y escalar a cualquier DPI, lo que resulta en elementos de interfaz de usuario nítidos en todos los monitores.
Los siguientes 13 estilos VCL personalizados se han actualizado para admitir por completo High DPI con sus aplicaciones VCL:
Calipso
Estelar
Luz de Wedgewood
Material Azul Oxford
Puerto Rico
Patrones de material azul
Windows 10 moderno Malibu
Ballena azul moderna de Windows 10
Windows 10 Modern Clear Day
Windows 10 Modern Black Pearl
Luz de interfaz de usuario plana
Lucky Point
Circón
Depurador paralelo
Las aplicaciones actuales no solo se ejecutan en un hilo, sino que se distribuyen en el hilo principal de la interfaz de usuario y en varios hilos paralelos, todos interactuando. Sin embargo, la mayoría de los IDE se basan en la interacción con un hilo a la vez durante la depuración, o tienen controles de depuración que ni siquiera son conscientes de que podrían existir más hilos.
La depuración de interacciones de subprocesos puede ser difícil, muy difícil … y tenemos la solución: una nueva extensión paralela de RAD Studio diseñada para comprender y controlar lo que está haciendo su aplicación multiproceso. Visualice pilas de llamadas de subprocesos en paralelo. Vea varios subprocesos indicados en línea en el editor de código. Controle la ejecución por subproceso. ¡Y más! Esta nueva y emocionante extensión llegará pronto exclusivamente para los clientes de suscripción de actualización que utilizan RAD Studio 10.4.1.
TwineCompile: acelere las compilaciones de C ++
C ++ puede ser lento de compilar, para todos los IDE de C ++, y TwineCompile es la respuesta. Esta increíble extensión de C ++ Builder paraleliza las compilaciones de C ++, acelerándolas por la cantidad de núcleos en su máquina, haciendo que su proyecto se compile en la mitad, una cuarta parte o incluso menos tiempo.
Este complemento es una de las mejores extensiones de productividad disponibles para el desarrollo de C ++. Dependiendo del tamaño de su aplicación, es posible ahorrar una hora o más por día, ¡un gran ahorro de tiempo para todo su equipo de desarrollo!
Hay tres videos cortos de dos minutos que presentan TwineCompile y cómo usarlo: probablemente los mejores seis minutos que podría dedicar hoy a mejorar las cosas para su equipo de C ++.
Puede obtener TwineCompile ahora para C ++ Builder con su suscripción de actualización, ¡incluso para los clientes de la edición Professional!
FMX Linux actualizado
También actualizamos recientemente el paquete FMXLinux para Delphi en GetIt. La última versión tiene soporte completo para 10.4.1 e incluye una serie de mejoras de calidad.
Wed Sep 16 2020 15:50:34 GMT+0700 (Western Indonesia Time)
I read the Blue Ocean book when we were planning the features of our influencer marketing platform, and it was really inspiring.
The Blue Ocean Strategy “presents a systematic approach to making the competition irrelevant and outlines principles and tools any organization can use to create and capture their own blue oceans.”
As summarized in the Wikipedia article about the book, it “presents analytical frameworks and tools to foster an organization’s ability to systematically create and capture ‘blue oceans’—unexplored new market areas.”
The authors analyzed the correlation of success stories across industries in order to formulate their innovation strategy.
In the slides and video below, I explain how we applied the Blue Ocean Strategy to plan the main features of the KashKlik platform and its business model.
Tue Sep 15 2020 22:19:36 GMT+0700 (Western Indonesia Time)
RAD Studio 10.4.1 — это выпуск, ориентированный на качество, и это касается IDE! Мы рассмотрели множество вопросов, включая некоторые очень часто запрашиваемые изменения; подробнее читайте ниже.
«Релиз, ориентированный на качество» — это релиз, в котором мы вводим очень мало новых функций и концентрируем 95% наших усилий по разработке на качестве. В среде IDE 10.4.1 было проделано много работы, и после установки он станет для вас более плавным. Но в 10.4.1 мы также потратили это время на новые функции и реализовали пару действительно часто запрашиваемых элементов.
В этом сообщении блога есть два раздела: во-первых, изменение старой функции IDE; во-вторых, новая функция и ключевые области, на которых мы сосредоточились!
Конструктор плавающих форм
Макеты и несколько мониторов: иначе говоря, «когда среда IDE что-то меняет?»
Отличное качество
Конструктор плавающих форм
Начиная с 2003 года, RAD Studio IDE была «закреплена»: то есть, хотя вы можете перетаскивать окна инструментов, такие как палитра, инспектор объектов, сообщения, часы и т. Д., В плавающее положение, общий дизайн IDE представляет собой интегрированное окно. В частности, редактор и конструктор форм интегрированы в главное окно.
«Конструктор плавающих форм» — это когда вы выключите это, и он позволяет проектируемой форме быть окном среди других окон; то есть он не встроен в основную среду IDE, а имитирует поведение Delphi 1-хотя-7, когда разработанная форма может располагаться над или за редактором. Это поведение было заменено современным дизайном стыковки в течение семнадцати лет, требующим вручную включать функцию старого стиля, и, к сожалению, не всегда вел себя хорошо. Оценивая эту функцию, мы приняли нелегкое решение удалить ее.
Что это значит? Означает ли это, что у вас не может быть, например, нескольких окон редактора или дизайнера? Нет! Вряд ли. Фактически, у вас все еще может быть несколько окон редактора, распределенных по нескольким мониторам, если вы хотите, причем каждое из них будет содержать разработанную форму … и мы даже настроили широкий спектр областей и настроек UX или поведения, пока вы это делаете!
Здесь вы можете увидеть, как RAD Studio размещена на двух мониторах. Вы всегда можете щелкнуть вкладку правой кнопкой мыши и выбрать «новое окно редактирования», а когда у вас появится второе или третье окно редактирования, вы можете перетаскивать вкладки между ними. Это должно работать довольно гладко: в 10.4.1 мы решили большое количество проблем с поведением вкладок и перетаскивания вкладок, окон редактирования и фокусировки.Здесь IDE проектирует сразу две формы. Главное окно находится на правом экране. Инспектор объектов, который закреплен справа, будет отображать информацию для той из двух форм, над которой работали в последний раз.
В этой области мы рассмотрели два действительно важных вопроса:
Раньше IDE работала не так, как хотелось бы, при щелчке по элементу на панели «Структура»: панель «Структура» иногда прокручивалась и выбирался не тот элемент. Теперь это решено. Если вы нажмете, он выберет то, на что вы нажали. Я действительно рад отметить это.
Когда у вас одновременно разрабатывается несколько форм, окна инспектора структуры и объекта будут отражать выбор дизайнера форм в окне, к которому они были прикреплены. Теперь они всегда отражают форму, которую вы редактируете. То есть, над чем бы вы ни работали, они будут отображать информацию, независимо от того, что к чему. Здесь важно отметить, насколько лучше 10.4.1 справляется с проектированием форм на нескольких экранах.
Это были «неприятности», вещи, которые могли показаться незначительными, но мешали работе. Мы рады отметить лучшее поведение в 10.4.1.
Макеты и несколько мониторов: иначе говоря, «когда среда IDE что-то меняет?»
При работе с макетами и дизайнером мы также добавили одну часто запрашиваемую функцию.
Макеты рабочего стола сохраняют положение и расположение окон вашей IDE, включая монитор, на котором находится ваша IDE. Вы можете создать свой собственный или перезаписать существующий — просто щелкните значок рабочего стола / луны в строке заголовка и сохраните рабочий стол (выберите новое имя или уже существующее имя). IDE переключается между макетами автоматически — какой из них она выбирает, когда может управляться на странице Параметры IDE> IDE> Сохранение и рабочий стол — но вы всегда можете выбрать один в любое время, щелкнув его в поле со списком в строке заголовка.
Хотя некоторые люди используют среду IDE на нескольких мониторах, например, проектируя на одном экране и кодируя на другом, также часто бывает, что среда IDE находится в полноэкранном режиме только на одном мониторе и перемещается на другой экран при отладке. То есть вы хотите, чтобы на вашем основном мониторе отображалась среда IDE при нормальной разработке, и вы хотите, чтобы он перемещался на другой монитор при отладке, чтобы ваше приложение находилось на основном мониторе. Это можно сделать, переместив IDE на другой экран и сохранив макет отладки. Затем каждый раз при отладке IDE будет переходить на второй экран. Ключ в том, что это происходит каждый раз. Иногда вам нужна гибкость.
Многие люди не хотят вручную сохранять макеты для определенных экранов. Вместо этого они хотят просто переместить среду IDE и оставить ее там, где вы ее поставили. В этом сценарии в прошлом, если вы перетащили свою среду IDE на второй экран и нажали «Выполнить» и не сохранили явно макет отладки на втором мониторе, среда IDE вернется на главный экран при переключении макета. Скорее всего, это не то, что вам нужно.
В версии 10.4.1 мы ввели настройки для управления движением среды IDE, и это позволяет указать среде IDE «не двигаться»; оставайтесь там, где я вас поставил »или« двигайтесь только при определенных обстоятельствах ». Новые настройки находятся в диалоговом окне «Параметры», в разделе «IDE»> «Сохранение и рабочий стол», «Макеты и несколько мониторов». Это позволяет вам выбирать, когда среда IDE может перемещать экраны при изменении макетов.
Новый сеттинг
Возможные варианты:
Разрешить изменение экрана при любом изменении макета: это старое поведение; IDE увидит, на каком экране был сохранен макет, и переместится туда
Разрешить только переключение экрана на / из макета отладки: это касается описанного выше сценария, когда вы можете захотеть иметь IDE на втором мониторе во время отладки, но только тогда. Это позволяет среде IDE перемещаться только при запуске или остановке отладки.
Всегда держите IDE на одном экране: IDE никогда не меняет мониторы. Он всегда будет оставаться там, где вы его положили.
Эти настройки должны значительно помочь вам контролировать, где размещается IDE. Помните, что вы всегда можете сохранить макет через значок рабочего стола / луны в строке заголовка и выберите макет в поле со списком в строке заголовка. Это в сочетании с этими новыми настройками позволит IDE выглядеть и располагаться там, где вам нужно, и позволит вам настроить ее так, чтобы она всегда располагалась и располагалась так, как вы хотите, автоматически.
Отличное качество
В версии 10.4.1 более 800 исправлений качества, а в документе «Что нового» есть огромный список. Это лишь некоторые из проблем, с которыми вы, возможно, столкнулись, но которые больше не возникают:
Пакеты теперь могут иметь автоматический суффикс версии вместо того, чтобы вручную указывать правильный суффикс версии для каждого нового выпуска. Диалоговое окно «Параметры» (параметры среды) всегда открывалось для отображения настроек целевой платформы Win64; теперь он открывается в соответствии с текущей активной платформой. Это часто запрашиваемый отчет об ошибке, который мы очень рады исправить. Инспектор объектов также имеет настройки выделения при щелчке и мерцания при рисовании. Функция «Удалить недопустимые пути» в редакторах путей в диалоговых окнах «Параметры» раньше могла удалять действительные пути. Теперь он удаляет только недопустимые пути. Вы можете прокручивать диалоговые окна параметров с помощью колесика мыши. В представлении «Проекты» некоторые параметры снова доступны в раскрывающемся списке на панели инструментов.
Обычно мы не выделяем проблемы, но их стоит отметить, потому что вы, вероятно, столкнулись с ними, и стоит знать, что они будут решены в 10.4.1.
В общем и целом
RAD Studio 10.4.1 уже вышла. Это качественный выпуск, в котором большое внимание уделяется качеству и улучшениям. Помимо множества настроек и исправлений в среде IDE, есть некоторые новые функции, связанные с макетами и несколькими мониторами, которые были запрошены в течение некоторого времени и которые, мы надеемся, вам действительно понравятся, а также некоторое внимание в областях качества. которые, как мы думаем, будут действительно популярны.
Tue Sep 15 2020 22:18:38 GMT+0700 (Western Indonesia Time)
RAD Studio 10.4.1 es una versión centrada en la calidad, ¡y esto se aplica al IDE! Hemos abordado muchos elementos, incluidos algunos cambios solicitados con mucha frecuencia; lea más abajo.
Una “versión centrada en la calidad” significa una en la que presentamos muy pocas funciones nuevas y centramos el 95% de nuestros esfuerzos de desarrollo en la calidad. 10.4.1 ha tenido mucho trabajo en el IDE y será mucho más sencillo para usted una vez que lo instale. Pero, en 10.4.1 también hemos dedicado ese tiempo a nuevas funciones e implementamos un par de elementos muy solicitados.
Hay dos secciones en esta publicación de blog: primero, un cambio a una característica IDE antigua; en segundo lugar, una nueva función y áreas clave en las que puede estar muy feliz de que nos hayamos centrado.
El diseñador de formularios flotantes
Diseños y varios monitores: también conocido como “¿cuándo cambia el IDE las cosas?”
Calidad notable
El diseñador de formularios flotantes
Desde 2003, el IDE de RAD Studio ha estado “acoplado”: es decir, si bien puede arrastrar ventanas de herramientas como Paleta, Inspector de objetos, Mensajes, Relojes, etc. para flotar, el diseño general del IDE es una ventana integrada. Específicamente, el editor y el diseñador de formularios están integrados en la ventana principal.
El “diseñador de formularios flotantes” es cuando desactiva esta opción y permite que el formulario que está diseñando sea una ventana entre otras ventanas; es decir, no está integrado en el IDE principal, pero imita el comportamiento de Delphi 1-a-7 donde el formulario diseñado puede estar por encima o por detrás del editor. Este comportamiento ha sido reemplazado por un diseño acoplado moderno durante diecisiete años, lo que requiere que active manualmente la función de estilo antiguo y, lamentablemente, no siempre se comportó bien. Al evaluar la función, tomamos la difícil decisión de eliminarla.
¿Qué significa esto? ¿Significa que no puede tener varias ventanas de editor o diseñador, por ejemplo? ¡No! Mucho no. De hecho, también puede tener varias ventanas de editor repartidas en varios monitores si lo desea, y cada una de ellas aloja un formulario diseñado … ¡e incluso hemos modificado una amplia gama de áreas y ajustes de UX o de comportamiento mientras lo hace!
Aquí puede ver RAD Studio distribuido en dos monitores. Siempre puede hacer clic con el botón derecho en una pestaña y seleccionar “nueva ventana de edición”, y una vez que tenga una segunda o tercera ventana de edición, puede arrastrar las pestañas entre ellas. Esto debería funcionar bastante bien: hemos resuelto una gran cantidad de problemas de comportamiento alrededor de pestañas y arrastrar pestañas, editar ventanas y problemas de enfoque en 10.4.1.Aquí, el IDE está diseñando dos formularios a la vez. La ventana principal está en la pantalla de la derecha. El Inspector de objetos, que está acoplado a la derecha, reflejará la información de cualquiera de las dos formas en las que se haya trabajado más recientemente.
Dos elementos realmente notables que hemos abordado en esta área son:
El IDE solía no funcionar como desearía al hacer clic en un elemento en el panel Estructura: el panel Estructura a veces se desplazaba y se seleccionaba el elemento incorrecto. Esto ahora está resuelto. Si hace clic, seleccionará en qué hizo clic. Estoy muy contento de notar este.
Cuando se están diseñando varios formularios a la vez, las ventanas del inspector de estructura y objetos reflejarían la selección del diseñador de formularios en la ventana a la que estaban acoplados. Ahora siempre reflejan el formulario que está editando. Es decir, sea lo que sea en lo que esté trabajando es para lo que mostrarán la información, independientemente de lo que esté atracado y dónde. La clave a tener en cuenta aquí es cuánto mejor es 10.4.1 en el manejo del diseño de formularios en múltiples pantallas.
Eran “molestias”, cosas que pueden parecer menores pero que se interponen en el camino al trabajar. Nos complace observar el mejor comportamiento en 10.4.1.
Diseños y varios monitores: también conocido como “¿cuándo cambia el IDE las cosas?”
Cuando trabajamos con diseños y el diseñador, también agregamos una característica solicitada con frecuencia.
Los diseños de escritorio guardan la posición y ubicación de las ventanas de su IDE, incluido el monitor en el que se encuentra su IDE. Puede crear el suyo propio o sobrescribir uno existente, simplemente haga clic en el icono de escritorio / luna en la barra de título y guarde el escritorio (elija un nombre nuevo o un nombre preexistente). El IDE cambia automáticamente entre diseños, cuál elige cuando se puede controlar en la página Opciones de IDE> IDE> Guardar y escritorio. pero siempre puede elegir uno en cualquier momento haciendo clic en uno en el cuadro combinado en la barra de título.
Aunque algunas personas usan el IDE en varios monitores, por ejemplo, diseñando en una pantalla y codificando en otra, también es común tener el IDE completamente en pantalla completa en un solo monitor y moverlo a otra pantalla al depurar. Es decir, desea que su monitor principal muestre el IDE cuando realiza un desarrollo normal y desea que se mueva a otro monitor cuando se depura, de modo que su aplicación se encuentre en el monitor principal. Esto es posible moviendo el IDE a otra pantalla y guardando el diseño de depuración. Luego, cada vez que depure, el IDE pasará a la segunda pantalla. La clave es que esto es todo el tiempo. A veces quieres algo de flexibilidad.
Mucha gente no quiere guardar diseños manualmente para pantallas específicas. En cambio, solo quieren mover el IDE y que se quede donde lo puso. En este escenario, en el pasado, si arrastraba su IDE a la segunda pantalla y hacía clic en Ejecutar, y no había guardado explícitamente su diseño de depuración en el segundo monitor, el IDE volvería a la pantalla principal cuando cambia de diseño. Es probable que eso no sea lo que quieres.
En 10.4.1, hemos introducido configuraciones para controlar cómo se mueve el IDE, y esto le permite decirle al IDE “no se mueva; quédate donde te puse “o” solo muévete en circunstancias específicas “. La nueva configuración se encuentra en el cuadro de diálogo Opciones, IDE> sección Guardar y escritorio, “Diseños y varios monitores”. Esto le permite elegir cuándo el IDE puede mover pantallas al cambiar de diseño.
El nuevo escenario
Las opciones son:
Permitir cambiar la pantalla en cualquier cambio de diseño: este es el comportamiento anterior; el IDE verá en qué pantalla se guardó un diseño y lo moverá allí
Solo permite cambiar la pantalla hacia / desde el diseño de depuración: esto aborda el escenario anterior en el que es posible que desee tener el IDE en su segundo monitor al depurar, pero solo entonces. Permite que el IDE se mueva solo al iniciar o detener la depuración.
Mantenga siempre el IDE en la misma pantalla: el IDE nunca cambiará de monitor. Siempre se quedará donde lo pones.
Esta configuración debería ser de gran ayuda para controlar dónde se coloca el IDE. Recuerde, siempre puede guardar un diseño a través del icono de escritorio / luna en la barra de título y elija un diseño a través del cuadro combinado en la barra de título. Hacerlo, combinado con estas nuevas configuraciones, le permitirá que el IDE se vea y se ubique donde lo necesite, y le permitirá configurarlo para que siempre esté ubicado y presentado como desee automáticamente.
Calidad notable
Hay más de 800 correcciones de calidad en 10.4.1 y el documento Novedades tiene una lista enorme. Esta es solo una selección de algunos problemas que puede haber encontrado y que vale la pena señalar que ya no ocurren:
Los paquetes ahora pueden tener un sufijo de versión automático, en lugar de especificar manualmente el sufijo de versión correcto con cada nueva versión.
El cuadro de diálogo Opciones (opciones de entorno) solía abrirse siempre para mostrar la configuración de la plataforma de destino Win64; ahora se abre según la plataforma actualmente activa. Este es un informe de error que se solicita con frecuencia, y estamos encantados de resolverlo.
El Inspector de objetos también tiene ajustes alrededor de la selección al hacer clic, así como parpadear al dibujar. “Eliminar rutas no válidas” en los editores de ruta en los cuadros de diálogo Opciones podía, en el pasado, eliminar rutas válidas. Ahora, solo elimina las rutas no válidas.
Puede desplazarse por los cuadros de diálogo de Opciones con la rueda del mouse
La vista Proyectos tiene algunas opciones disponibles nuevamente a través de un menú desplegable en la barra de herramientas
Normalmente no destacamos los problemas, pero vale la pena señalarlos porque es probable que haya encontrado y vale la pena saber que se resuelven en 10.4.1.
En general
RAD Studio 10.4.1 ya está disponible. Es un lanzamiento de calidad, con un gran enfoque en la calidad y las mejoras. Además de muchos ajustes y correcciones en el IDE, hay algunas características nuevas en cuanto a diseños y monitores múltiples que se han solicitado durante algún tiempo y que esperamos que realmente le gusten, así como también algo de atención en áreas de calidad. que creemos que será muy popular.
Fri Sep 11 2020 19:49:19 GMT+0700 (Western Indonesia Time)
Este verano y el año entero son realmente extraños. Nuestras vidas han cambiado de muchas maneras, y muchos de estos cambios están destinados a continuar. La importancia de la tecnología y la necesidad de crear rápidamente soluciones fiables es creciente. Embarcadero está teniendo éxito gracias a la solidez de sus productos y su remarcable comunidad. Tenemos mucho que hacer este verano. ¡Sigamos construyendo juntos!
Actualizaciones de calidad en 10.4
Los grandes lanzamientos tienen muchas dependencias y, a pesar de las rigurosas pruebas, 10.4 ha tenido su cuota de problemas de calidad. Hemos lanzado varios parches que resuelven los principales problemas. La versión 10.4.1, que saldrá en septiembre, proporcionará más mejoras de calidad y pequeñas ampliaciones. Los parches son ahora mucho más visibles gracias a las mejoras en GetIt.
Programa de actualización de 10.4
Hace más de dos años interrumpimos nuestro SKU de actualización. Con el 10.4, las solicitudes de actualización han aumentado rápidamente y muchos clientes están frustrados porque no hay un camino de actualización más barato. Así que hemos reinstaurado nuestro programa de actualización, permitiendo a los clientes actualizar las versiones anteriores a un precio de descuento. La fecha de vencimiento de este programa es el 25 de septiembre. Habrá comunicaciones por correo electrónico con detalles, pero por favor contacte a su revendedor o al Gerente de Cuentas de Embarcadero para recibir rápidamente su oferta.
Packs de bonos de verano y promociones
Para hacer el 10.4 aún más atractivo, hemos trabajado con muchos de nuestros socios tecnológicos para crear un pack de Enterprise atractivo y único. The combined value of packages included in this pack is over $13,000. In addition, we continue to enhance our GetIt packages for ALL update subscription customers, which contain over $1,000 of free software, including IDE components, Styles, FMX Linux, connectivity components, and more. We plan to keep upgrading the Upgrade Packs throughout the summer, which now is more easily managed through GetIt, so keep checking for additional benefits. These will be automatically available for eligible purchases throughout the summer.
RAD Studio is the best platform for creating native Windows applications. We believe that the desktop space has been unfairly overlooked over the years and has a lot to offer. The huge trend toward the web has in some ways oversimplified UX experiences due to limitations of the browser. The type of mobile-first applications further contributed to oversimplification. Yet native desktop continues to provide many advantages when it comes to more complex and high-performance applications. This is obvious in gaming, but new trends in digitization may push desktop performance advantages and new UX needs to the forefront. Working from home boosted the use of collaborative apps, and any more complex apps are indeed native. The explosion of AI will also increase the number of simultaneous signals that will need to be presented to a UX, and browser interfaces will continue to be very limited in their ability to handle these.
We see an opportunity for a resurgence in desktop usage. Cross-platform will continue to be key, but maybe the use cases will start with the best medium, and supplemental experiences, such as mobile, will be treated as such. Trying to build an ERP or a trading app while thinking mobile-first could be grossly undeserving of productivity and constrain the imagination regarding what could be possible. You work with IDEs all the time, and while new tools such as Visual Code are advancing, a true high-performance Web IDE is still highly impractical. We feel that it is appropriate for us to spearhead a Desktop UX Summit that could continue to expand and include many more partners and companies and drive new thinking and innovation.
We have increased our commitment to open source projects, where it makes sense. I want to highlight a couple that we are sponsoring this summer. We have created a new branch of Dev C++, which is one of the most popular editors for C++ and is built with Delphi. Our MVP Eli M. has been leading this effort as a great example that uses 10.4 to modernize a “legacy” application. This summer we will also open source the code base of Bold, which is a sort of low code solution for RAD Studio. We have a passionate group of Delphi community experts who will take that effort forward. Finally, we are collaborating with the creator of the popular Python editor PyScripter, Kiriakos Vlahos, to bring access to popular Python libraries to RAD Studio. I am especially excited about this effort, as Python is a natural complement to Delphi. One of the key advantages of Python is the plethora of libraries, especially around analytics and data management, and we are making it easier for our customers to use them!
C++Builder
We just posted a C++ road map and discussion of C++Builder directions and features. Normally we simply post a list of features we plan, but this time we discuss our strategy and both what we’ve done recently and our future plans in light of that strategy, which we believe will be helpful to you. We also discuss the results of answers given by you, our customers, to a key survey and what we’re doing in response. There’s a lot here about Windows and quality.
Other Updates
We have a number of other important updates, including:
Waiving Penalties on Late Renewals due to COVID-19: We understand that COVID-19 has created a lot of hardship for individuals and businesses. Our Renewals Team is running a number of programs to make it easier for expired customers to get back on maintenance plans. Please contact our resellers or Embarcadero renewals directly.
Update Blog Platform: Less than two years ago we changed our blogging platform to standardize with other Idera-owned brands. We feel that the uniqueness in our audience and richness of content is not well supported by this platform, and we plan to change again to a more user-friendly one with better multilanguage support and more flexible authoring capabilities.
Discontinue Proprietary Forum: Our approach to forums is outdated. We feel that our community will be better served by open third-party forums, either dedicated ones, such as Delphi PRAXiS, or general ones, such as Stack Overflow. This creates much wider visibility and access to community support. Embarcadero official support will be provided through our Support Portal for Update Subscription customers.
Maintenance of Standalone FireDAC Discontinued: The SKU has been merged with our Enterprise edition. Please connect with our Sales Team to discuss options to upgrade your Professional maintenance and FireDAC maintenance. (Update: This is in reference to the C/S Add-on Pack that was previously available for Professional licenses.)
Fri Sep 11 2020 17:05:45 GMT+0700 (Western Indonesia Time)
The Mu’allaqah of the pre-Islamic poet Amr ibn Kulthum is one of the most stunningly beautiful poems in Arabic. In this episode we dive in deep, trying to understand the meanings and brilliance behind these Arabic lines.
Fri Sep 11 2020 11:01:46 GMT+0700 (Western Indonesia Time)
Важная новость для владельцев действующих (активных) подписок на обновления и поддержку. На прошлой неделе было несколько обращений от пользователей с просьбой помочь получить доступ к службе поддержки, поскольку попасть в портал привычными методами не получалось. Embarcadero в данный момент активно обновляет все пользовательские ресурсы, чтобы сделать их более наглядными, удобными и быстрыми. Новые порталы открываются по очереди, а старые сайты, хотя и остаются доступными, в скором времени будут остановлены и закрыты.
Отправлять и получать комментарии в службу технической поддержки
Этот новый портал открыт для клиентов с активными контрактами на техническое обслуживание. Некоторые такие клиенты уже получили новые учетные данные для входа на портал. Если вы случайно не получили информацию о новом аккаунте по электронной почте, не стоит беспокоиться. Страница входа на новый портал содержит ссылку для регистрации вашей учетной записи.
После подтверждения вы получите электронное письмо с информацией о вашем новом аккаунте. С учетом удобства наших клиентов, вы можете получить доступ к порталу обычным путем, посетив нашу страницу поддержки. В наших планах на следующий квартал расширить новый портал поддержки клиентов до семейства продуктов IDERA ER/Studio и DB PowerStudio!
И краткое напоминание о новом портале my.embarcadero.com, где вы сможете получить доступ ко всем своим зарегистрированным продуктам, серийным номерам, сетевым лицензиям и файлам для скачивания.
Thu Sep 10 2020 22:25:54 GMT+0700 (Western Indonesia Time)
Nos complace anunciar un portal de asistencia al cliente actualizado para los productos Embarcadero Development Tools. Esta fase del lanzamiento del portal incluye una interfaz menos compleja y más adaptada visualmente que le permite:
Presentar nuevos casos
Ver casos existentes
Agregar archivos adjuntos
Verificar el estado del caso
Envíe y reciba comentarios con Soporte técnico
Este nuevo portal está abierto a clientes con contratos de mantenimiento vigentes. Algunos clientes activos ya han recibido nuevas credenciales de inicio de sesión para el portal. Si por casualidad no recibió la información de la nueva cuenta por correo electrónico, no se preocupe. La página de inicio de sesión del nuevo portal contiene un enlace para registrarse en su cuenta.
Una vez verificado, recibirá un correo electrónico con su nueva cuenta de inicio de sesión. Teniendo en cuenta la conveniencia de nuestro cliente, puede acceder al portal de la misma manera que siempre lo ha hecho visitando nuestra página de soporte. ¡Nuestros planes para el próximo trimestre son expandir el nuevo portal de soporte al cliente a la familia de productos IDERA ER / Studio y DB PowerStudio!
Y un breve recordatorio sobre el nuevo my.embarcadero.com, donde puede acceder a todos sus productos registrados, números de serie, licencias de red y descargas.
Wed Sep 09 2020 22:36:09 GMT+0700 (Western Indonesia Time)
Cree aplicaciones en tiempo real conectadas a la web con soporte para WebSockets. IPWorks WebSockets incluye un conjunto de potentes componentes para integrar las capacidades de comunicación de WebSocket en aplicaciones web, de escritorio y móviles. Los componentes son perfectos para crear aplicaciones conectadas a la Web que requieren datos en tiempo real, incluidos chat, juegos para varios jugadores, aplicaciones financieras en vivo y más.
Componentes de integración de WebSockets
IPWorks WebSockets incluye un conjunto de potentes componentes para integrar las capacidades de comunicación de WebSocket en aplicaciones web, de escritorio y móviles. Los componentes son perfectos para crear aplicaciones conectadas a la web que requieren datos en tiempo real, incluidos chat, juegos para varios jugadores, aplicaciones financieras en vivo y más.
Servidor y proxy WebSocket
Potentes componentes de servidor y proxy para integrar comunicaciones web en vivo.
Elimina el sondeo prolongado
Los WebSockets permiten que el servidor envíe datos a los clientes conectados en tiempo real, lo que elimina la necesidad de técnicas de sondeo largo y poco fiables.
Diseño uniforme y extensible
Muy fácil de usar, con un diseño uniforme, intuitivo y extensible. Interfaces de componentes comunes entre plataformas y tecnologías.
Componentes totalmente integrados
Componentes de software nativos para cualquier tecnología de desarrollo compatible, sin dependencias de bibliotecas externas.
Rendimiento increíblemente rápido
Basado en una arquitectura de socket asincrónica optimizada que se ha perfeccionado activamente durante más de dos décadas.
Soporte técnico excepcional
Respaldado por un equipo experto de profesionales de soporte. Soporte por correo electrónico gratuito e ilimitado o opciones de soporte premium pagado.
Características del producto
Proporciona un marco estándar para comunicaciones bidireccionales continuas.
Soporte para conexiones WebSocket (ws: //) y WebSocket Secure (wss: //) con cifrado SSL fuerte de hasta 256 bits y certificados digitales.
Autentique y cifre / descifre los datos enviados y recibidos utilizando TLS 1.3, TLS 1.2, 1.1 o 1.0.
Las capacidades avanzadas de certificados digitales le permiten crear, firmar y administrar certificados digitales X.509. Conviértase en su propia autoridad certificadora.
Un marco unificado completo con un modelo de objetos común y fácil de aprender e interfaces simplificadas que lo ayudan a hacer más.
Los componentes son seguros para subprocesos en miembros críticos.
Rápido, robusto, confiable: los componentes consumen recursos mínimos.
Componentes de desarrollo nativos para todas las plataformas y tecnologías de componentes compatibles.
Componentes sólidos como una roca rigurosamente probados que se han sometido a cientos de miles de horas de pruebas tanto internamente por nuestro equipo de control de calidad como externamente a través de las instalaciones del cliente.
Documentación de referencia detallada, aplicaciones de muestra, archivos de ayuda totalmente indexados y una amplia base de conocimientos en línea.
Respaldado por soporte profesional de varios niveles, incluido soporte por correo electrónico gratuito y soporte de pago a nivel empresarial.
Componentes nativos de Delphi VCL sin dependencias externas. Cuenta con los mismos componentes confiables que vienen con otras ediciones, disponibles como componentes nativos de Delphi VCL para un rendimiento real de Delphi.
El componente WebSocketServer se utiliza para crear un servidor WebSocket.
¿Te gusta lo que ves? La biblioteca IPWorks WebSockets de / n Software y cientos de otros componentes se incluyen con nuestro Enterprise Component Pack . Por tiempo limitado, cuando compre RAD Studio Enterprise o Architect Edition a un precio de actualización especial, también obtendrá este paquete de software de terceros con un valor de más de $ 13,000, ¡SIN COSTO ADICIONAL! ¡Actualice a RAD Studio 10.4.1 hoy mismo!
Wed Sep 09 2020 22:34:43 GMT+0700 (Western Indonesia Time)
RAD Studio tiene un gran ecosistema de proveedores externos, que proporciona componentes y complementos IDE, software que vive dentro del propio IDE. En RAD Studio 10.4.1, hicimos algunos cambios en nuestro soporte de ventanas acopladas (una ventana acoplada es un panel como las vistas Estructura, Proyectos o Paleta). Este cambio puede crear problemas con los complementos IDE que usan sus propias ventanas acopladas personalizadas.
Un ejemplo de dicho complemento son los marcadores, distribuidos por Embarcadero, pero también otros complementos de terceros de uso común.
El problema puede aparecer como violaciones de acceso al usar los complementos o IDE, o como la ventana acoplada del complemento que se muestra en un momento inesperado y posiblemente otro comportamiento inesperado.
El problema se resuelve cuando el complemento se vuelve a compilar para 10.4.1 y nos comunicamos con nuestros socios tecnológicos para solicitarles que distribuyan una versión recompilada actualizada de cualquier complemento IDE que distribuyan para 10.4.1. También actualizaremos nuestro propio complemento IDE, Marcadores, a una versión compatible con 10.4.1, descargable a través de GetIt. Esto debería estar disponible dentro de las 24 horas.
Recomendamos desinstalar los complementos IDE antes de actualizar a 10.4.1 y luego volver a instalar las versiones 10.4.1 de sus complementos IDE.
Tue Sep 08 2020 22:42:56 GMT+0700 (Western Indonesia Time)
Onze heroriëntatie op kwaliteitsborging en bugfixes voor C ++ Builder is nog nooit zo duidelijk geweest als in 10.4.1. Hoewel we uw geduld op prijs stellen, beschouwen we het niet als vanzelfsprekend. We hebben nog nooit zo veel energie gehad om voort te bouwen op de solide basis van C ++ Builder en zullen deze push in latere releases het hele jaar door voortzetten.
Enkele hoogtepunten uit deze release:
De Win64 debugger, gebaseerd op LLDB, heeft een aantal belangrijke kwaliteitsverbeteringen en features gehad. Het heeft nu bijvoorbeeld sterk verbeterde prestaties voor applicaties met honderden threads; verbeteringen in het omgaan met uitzonderingen, met name OS-uitzonderingen; verwerkt geheugenveranderingen in complexe variabelen (bijv., als het item waarnaar een aanwijzer verwijst verandert, wordt dat weerspiegeld in de IDE); en vele andere reparaties op verschillende gebieden, evenals het verkrijgen van een nieuwe formatter (visualiser) voor unique_ptr.
De Win64-linker (ilink64) heeft een aantal verbeteringen in de geheugenverwerking, die klanten die geheugenproblemen tegenkomen, vooral bij debug-builds zouden moeten helpen
Belangrijke kwaliteitsfixes in de hele toolchain, variërend van Midas tot het afhandelen van uitzonderingen tot RTTI tot het afhandelen van uitzonderingen tot stabiliteit.
Ons doel is om C ++ Builder terug te brengen naar een stabiele en efficiënte IDE. Als we eenmaal vertrouwd zijn met die basis, zullen we onze aandacht richten op grotere en betere dingen. We hopen de voltooiing van de code bij te werken en de Win64-linker volledig te vervangen in het komende jaar, wat een veel betere in-IDE-productiviteit zal opleveren en u zal helpen bij het koppelen van grote projecten. Houd meer nieuws in de gaten als 10.4.2 aan het licht komt.
Status van Visual Assist-integratie in RAD Studio
Op onze roadmap staat de integratie van Visual Assist in C ++ Builder. We concentreren ons eerst op de belangrijkste functies, zoals het aanvullen van code, het vinden van referenties, navigatie en refactoren, als kandidaten voor de eerste release. Dit is aan de gang. De C ++ -parser van Visual Assist begrijpt momenteel onze C ++ -extensies (eigenschappen, sluitingen, enz.) En we onderzoeken verschillende benaderingen van IDE-integratie. Kijk voor meer informatie over Visual Assist op https://www.wholetomato.com/features. Probeer het eens in Visual Studio en als er functies zijn die u graag wilt gebruiken voor C ++ Builder, stuur ons dan een functieverzoek.
C ++ bibliotheken
We werken aan het verbeteren van de compatibiliteit van C ++ Builder en we zien zeer goede resultaten. U herinnert zich misschien uit een eerdere blogpost dat we algemene open source C ++ -bibliotheken gebruiken en ervoor zorgen dat ze werken met C ++ Builder. (Binnenkort zullen er verschillende nieuwe op GetIt verschijnen.) Dit betekent niet alleen dat u gemakkelijker gemeenschappelijke bruikbare bibliotheken tot uw beschikking hebt, maar het betekent ook dat u waarschijnlijk gemakkelijker elke C ++ -bibliotheek kunt ophalen die u wilt gebruiken.
Deze inspanningen hebben hun vruchten afgeworpen: niet alleen hebben we verschillende bibliotheken in GetIt, en er komen er binnenkort meer bij, maar het werk dat moet worden gedaan om een bibliotheek in C ++ Builder te gebruiken, is veranderd. Tegenwoordig is het meestal eenvoudig, meestal met macro’s (ifdef-s) die zijn geschreven voor MSVC of GCC om ook Embarcadero te erkennen of de juiste code in te pakken. De overgrote meerderheid van RTL of andere methoden bestaat en bibliotheken kunnen goed worden gebruikt. Vaak wordt een bibliotheek meteen samengesteld. Als u een bibliotheek heeft waarin u geïnteresseerd bent, raden we u aan deze uit te proberen met C ++ Builder 10.4.1: er kunnen misschien kleine wijzigingen worden aangebracht, maar de algehele compatibiliteit zou aanzienlijk moeten worden verbeterd.
Desktop UX Summit
In het afgelopen decennium is applicatieontwerp sterk gericht geweest op mobiele of webapps, en webdesign heeft het applicatieontwerp sterk beïnvloed – vaak ten nadele ervan. Een desktop- of mobiele applicatie is geen website.
Dit jaar is de eerste Desktop UX Summit – een gratis online conferentie over het ontwerpen van desktoptoepassingen, van een grote verscheidenheid aan sprekers die vaak niet verbonden zijn met of geen gebruik maken van Embarcadero-technologieën. We willen ontwikkelaars in het algemeen bewust maken van het ontwerp van desktoptoepassingen, niet alleen onze eigen klanten. Het heeft een aantal geweldige sessies en is gratis! Markeer dus uw agenda’s voor 16 en 17 september en bezoek https://summit.desktopfirst.com om u te registreren!
Nieuwe gratis tool: Dev C ++
Ander nieuws, aangezien we nieuw leven inblazen om kwaliteitsgereedschappen voor C ++ -ontwikkeling te produceren, willen we u kennis laten maken met onze nieuwste Open Source-teksteditor met een kleine footprint, Embarcadero Dev-C ++.
Embarcadero Dev-C ++ is een nieuwe en verbeterde vork van Bloodshed Dev-C ++ en Orwell Dev-C ++. Het is een complete IDE en code-editor voor de programmeertaal C / C ++. Het gebruikt MinGW-poort van GCC (GNU Compiler Collection) als compiler. Embarcadero Dev-C ++ kan ook worden gebruikt in combinatie met Cygwin of een andere op GCC gebaseerde compiler. We konden dit verpakken met een zeer lage geheugenvoetafdruk omdat het een native Windows-applicatie is en geen gebruik maakt van Electron. Als klap op de vuurpijl werd al het werk aan het updaten van deze vork gedaan met behulp van de nieuwste versie van Embarcadero Delphi. Ga naar https://www.embarcadero.com/free-tools/dev-cpp om deze en andere gratis tools te downloaden
C ++ News wereldwijd
Eindelijk een overzicht van recent C ++ nieuws en blogposts!
MeetingC ++, een van de beste C ++ -conferenties, is dit jaar online . Early bird-tickets worden uitgevoerd in de Midden-Europese tijdzone en kosten € 49.
De jaarlijkse LLVM (Clang, LLDB) bijeenkomst staat ook dit jaar online. Tickets zijn gratis, maar je kunt ook een betaald supporterticket kopen.
‘The problem with C’ : een heel interessante post van cor3ntin over hoe de talen uiteenlopen en wat C-compatibiliteit betekent voor C ++
David Ik heb een geweldige blogpost geschreven waarin ik enkele Boost-klassen met C ++ Builder gebruikte . (Een recente versie van Boost bevindt zich in GetIt.) Het toont met name de circulaire bufferklasse. Boost zit vol met handige tools en het is geweldig om te zien dat een aantal ervan wordt gemarkeerd.
Adecc Systemshaus schrijft een C ++ – blog . Er zijn enkele geweldige berichten, met name over het gebruik van standaard C ++ – streams, zoals C ++ – streams met een TListView .
Incredibuild, een geweldig build-systeem voor het distribueren van C ++ builds over machines, heeft een poll over je favoriete C ++ IDE en op het moment van schrijven zijn Visual Studio, C ++ Builder en ‘Other’ elk met ongeveer 30% verbonden.
Ten slotte is C ++ 20 voltooid! Lees hier meer over de blog van Herb Sutter .
Tue Sep 08 2020 21:33:50 GMT+0700 (Western Indonesia Time)
Even years after switching from centralized version control to a decentralized one (or to be more precise: from Subversion to Mercurial) I still find myself stuffing different unrelated changes into one commit. Sometimes there are just some small changes to make the code compile in your current environment, sometimes you correct typos in the comments or string resources, sometimes it is just a better formatting of the code. All of these changes have nothing to do with the current bug to fix or the current feature to implement, but they end up being part of the commit – and that is just plain wrong! When it comes to commits, make them as small as possible!
A changeset is no suitcase to be packed with clothes for all types of occasions. It should have been created for one purpose only in the first place. While it is totally OK to have multiple changesets for one bugfix or feature request or refactoring, it is just bad practice to have one changeset targeting more than one of those.
Let’s say you are fixing a bug in the release branch and then want to merge it into the develop branch. There is a much lesser chance to encounter any merge conflicts when the changeset only touches the code necessary to fix the bug. Keeping the changeset small can make the difference between an automatic merge and the need for manually resolving conflicts.
If you are working in an environment that allows to connect the changesets to the corresponding bug or feature in your issue tracker, you can query for those changesets to get an estimate for a similar bug or feature. Some months later it may be quite difficult to separate the unrelated changes from the relevant ones just by analyzing the changeset – even if it is yourself doing that analysis.
There are different ways to help you keeping your commits clean. The obvious one is just skipping files that don’t belong to the change in question. If the change was not done intentionally (be it by yourself or automatically by the IDE), either revert it immediately or keep the change and uncheck the file for the commit. Sometimes the latter may be necessary just to satisfy the IDE.
The next step is to get into the files content and select only those changes that are necessary. Mercurial and Git (and probably others, too) make this a simple click on a checkbox.
As a nice side effect you get short commit comments usually fitting in one line, which makes them fully visible in the history.
I am constantly getting better in this. What about you?
Thu Sep 03 2020 02:56:35 GMT+0700 (Western Indonesia Time)
Why React is the Top UI Framework in the World
React is the world’s most popular JavaScript framework, but it’s not cool because it’s popular. It’s popular because it’s cool. Most React introductions jump right into showing you examples of how to use React, and skip the “why”.
That’s cool. If you want to jump in and start playing with React right away, the official documentation has lots of resources to help you get started.
This post is for people who want an answer to the questions, “why React? Why does React work the way it works? What is the purpose of the API designs?”
Why React?
Life is simpler when UI components are unaware of the network, business logic, or app state. Given the same props, always render the same data.
When React was first introduced, it fundamentally changed how JavaScript frameworks worked. While everyone else was pushing MVC, MVVM, etc, React chose to isolate view rendering from the model representation and introduce a completely new architecture to the JavaScript front-end ecosystem: Flux.
Why did the React team do that? Why was it better than the MVC frameworks (and jQuery spaghetti) that came before?
In the year 2013, Facebook had just spent quite a bit of effort integrating the chat feature: A feature that would be live and available across the app experience, integrating on virtually every page of the site. It was a complex app within an already complex app, and uncontrolled mutation of the DOM, along with the parallel and asynchronous nature of multi-user I/O presented difficult challenges for the Facebook team.
For instance, how can you predict what is going to be rendered to the screen when anything can grab the DOM and mutate it at any time for any reason, and how can you prove that what got rendered was correct?
You couldn’t make those guarantees with any of the popular front-end frameworks prior to React. DOM race conditions were one of the most common bugs in early web applications.
“Non-determinism = parallel processing + mutable state” — Martin Odersky
Job #1 of the React team was to fix that problem. They did that with two key innovations:
Unidirectional data binding with the flux architecture.
Component state is immutable. Once set, the state of a component can’t be changed. State changes don’t change existing view state. Instead, they trigger a new view render with a new state.
“The simplest way that we have found, conceptually, to structure and render our views, is to just try to avoid mutation altogether.” — Tom Occhino, JSConfUS 2013
With flux, React tamed the uncontrolled mutation problem. Instead of attaching event listeners to any arbitrary number of arbitrary objects (models) to trigger DOM updates, React introduced a single way to manipulate a component’s state: Dispatch to a store. When the store state changes, the store will ask the component to re-render.
Flux architecture
When I’m asked “why should I care about React”, my answer is simple: Because we want deterministic view renders, and React makes that a lot easier.
Note: It is an anti-pattern to read data from the DOM for the purpose of implementing domain logic. Doing so defeats the purpose of using React. Instead, read data from your store and make those choices prior to render-time.
If deterministic render was React’s only trick, it would still be an amazing innovation. But the React team wasn’t done innovating. They launched with several more killer features, and over the years, they’ve added even more.
JSX
JSX is an extension to JavaScript which allows you to declaratively create custom UI components. JSX has important benefits:
Easy, declarative markup.
Colocated with your component.
Separate by concern, (e.g., UI vs state logic, vs side-effects) not by technology (e.g., HTML, CSS, JavaScript).
Prior to JSX, if you wanted to write declarative UI code, you had to use HTML templates, and there was no good standard for it at the time. Every framework used their own special syntax you had to learn to do things like loop over data, interpolate variables, or do conditional branching.
Today, if you look at other frameworks, you still have to learn special syntax like the *ngFor directive from Angular. Since JSX is a superset of JavaScript, you get all of JavaScript’s existing features included in your JSX markup.
You can iterate over items with Array.prototype.map, use logic operators, branch with ternary expressions, call pure functions, interpolate over template literals, or generally anything else a JavaScript expression can do. In my opinion, this is a huge advantage over competing UI frameworks.
There are a couple rules you may struggle with at first:
The class attribute becomes className in JSX.
For every item in a list of items you want to display, you need a stable, unique identifier to use for the JSX key attribute. The key must not change when items are added or removed. In practice, most list items have unique ids in your data model, and those usually work great as keys.
React didn’t prescribe a single solution for CSS. You can pass a JavaScript style object to the style property, in which case, many common style names are converted to camelCase for the object literal form, but there are other options. I mix and match a couple different solutions, depending on the scope I want for the style I’m applying: global styles for theming and common layouts, and local scoped for this component only.
Here are my favorite options:
CSS files can be loaded in your page header for common global layouts, fonts, etc. They work fine.
CSS modules are locally scoped CSS files that you can import directly in your JavaScript files. You’ll need a properly configured loader. Next.js enables this by default.
styled-jsx lets you declare styles inline in your React components, similar to how <style> tags work in HTML. The scope for those styles is hyper-local, meaning that only sibling tags and their children will be affected by the styles. Next.js also enables styled-jsx by default.
Synthetic Events
React provides a wrapper around the DOM events called synthetic events. They are very cool for several reasons. Synthetic events:
Smooth over cross-platform differences in event handling, making it easier to make your JS code work in every browser.
Are automatically memory managed. If you were going to make an infinitely scrolling list in raw JavaScript + HTML, you would need to delegate events or hook and unhook event listeners as elements scroll on and off the screen in order to avoid memory leaks. Synthetic events are automatically delegated to the root node, meaning React developers get event memory management for free.
Note: Prior to React v17, it’s not possible to access synthetic event properties in asynchronous functions because of event pooling. Instead, grab the data you need from the event object and reference it in your closure environment. Event pooling was removed in v17 because browser optimizations take care of it.
Note: Prior to v17, synthetic events were delegated to the document node. After v17, synthetic events are delegated to the React root node.
Component Lifecycle
The React component lifecycle exists to protect component state. Component state must not be mutated while React is drawing the component. Instead, a component gets into a known state, draws, and then opens up the lifecycle for effects, state updates, and events.
Understanding the lifecycle is key to understanding how to do things the React way, so you won’t fight with React, or accidentally defeat the purpose of using in the first place by improperly mutating or reading state from the DOM.
Beginning at React 0.14, React introduced class syntax to hook into React’s component lifecycle. React has two different lifecycles to think about: Mounting, Updating, and Unmounting:
React Lifecycle
And then within the update lifecycle, there are three more phases:
React Update Cycle
Render — aside from calling hooks, your render function should be deterministic and have no side-effects. You should usually think of it as a pure function from props to JSX.
Pre-Commit — Here you can read from the DOM using the getSnapShotBeforeUpdate lifecycle method. Useful if you need to read things like scroll position or the rendered size of an element before the DOM re-renders.
Commit — During the commit phase, React updates the DOM and refs. You can tap into it using componentDidUpdate or the useEffect hook. This is where it’s OK to run effects, schedule updates, use the DOM, etc.
Dan Abramov made a great diagram that spells out all the details as you might see it from the React class perspective:
React Component Lifecycle Diagram by Dan Abramov (Source)
In my opinion, thinking of a component as a long-lived class is not the best mental model for how React works. Remember: React component state is not meant to be mutated. It’s meant to be replaced, and each replacement of the current state triggers a re-render. This enables what is arguably React’s best feature: Making it easy to create deterministic view renders.
A better mental model for that behavior is that every time React renders, it calls a deterministic function that returns JSX. That function should not directly invoke its own side effects, but can queue up effects for React to run.
In other words, you should think of most React components as pure functions from props to JSX.
A pure function:
Given same inputs, always returns the same output (deterministic).
Has no side-effects (e.g., network I/O, logging to console, writing to localStorage, etc.)
Note: If your component needs effects, use useEffect or call an action creator passed through props and handle the effects in middleware.
React Hooks
React 16.8 introduced a new concept: React hooks are functions that allow you to tap into the React component lifecycle without using the class syntax or directly calling lifecycle methods. Instead of declaring a class, you write a render function.
Calling a hook generally introduces side-effects — effects which allow your component to hook into things like component state and I/O. A side-effect is any state change observable outside the function other than the function’s return value.
useEffect lets you queue up effects to run at the appropriate time in the component lifecycle, which can be just after the component mounts (like componentDidMount), during the commit phase (like componentDidUpdate), or just before the component unmounts (like componentWillUnmount).
Notice how three different lifecycle methods fell out of a single React hook? That’s because instead of putting logic in lifecycle methods, hooks allow you to keep related logic together.
Many components need to hook something up when a component mounts, update it every time the component re-draws, and then clean up before the component unmounts to prevent memory leaks. With useEffect, you can do that all in one function call, instead of splitting your logic into 3 different methods, mixed with all the other unrelated logic that also needs to use those methods.
Hooks enable you to:
Write your components as functions instead of classes.
Organize your code better.
Share reusable logic between different components.
Compose hooks to create your own custom hooks (call a hook from inside another hook).
Generally speaking, you should favor function components and React hooks over class-based components. They will usually be less code, better organized, more readable, more reusable, and more testable.
Container vs Presentation Components
For better modularity and reusability of components, I tend to write my components in two parts:
Container components are components that are connected to the data store and may have side-effects.
Presentation components are mostly pure components, which, given the same props and context, always return the same JSX.
Tip: Pure components should not be confused with React.PureComponent, which is named after pure components because it’s unsafe to use it for components that aren’t pure.
Presentation components:
Don’t touch the network
Don’t save or load from localStorage
Don’t generate random data
Don’t read directly from the current system time (e.g., by calling a function like Date.now())
Don’t interact directly with the store
May use local component state for things like form inputs, as long as you can pass in an initial state so that they can be deterministically tested
That last point is why I call presentation components “mostly pure”. Once React takes control of the lifecycle, they’re essentially reading their component state from React global state. So hooks like useState and useReducer provide implicit data input (input sources that are not declared in the function signature) making them technically impure. If you want them to be really pure, you can delegate all state management responsibility to the container component, but IMO, it’s overkill as long as your component is still unit testable.
“Perfect is the enemy of good” — Voltaire
Container Components
Container components are components which handle state management, I/O, and any other effects. They should not render their own markup — instead, they delegate rendering to the presentation component they wrap. Typically, a container component in a React+Redux app would simply invoke mapStateToProps, mapDispatchToProps, and wrap the presentation component with the result. They may also compose in many cross-cutting concerns (see below).
Higher Order Components
A Higher Order Component (HOC) is a component which takes a component and returns a component in order to compose in additional functionality.
Higher Order Components work by wrapping a component around another component. The wrapping component adds some DOM or logic, and may or may not pass additional props into the wrapped component.
Unlike React hooks and render props components, HOCs are composable using standard function composition, so you can declaratively mix in shared behavior across all your app components without those components knowing that those behaviors exist. For example, here is an HOC from EricElliottJS.com:
This mixes in all the common, cross-cutting concerns shared by all the pages on EricElliottJS.com. withEnv pulls in environment settings, withAuth adds GitHub authentication, withLoader displays a spinner while user data is loading, withLayout({ showFooter: true }) displays our default layout with a footer at the bottom of the page, withFeatures loads our feature toggle settings, withRouter loads our router, withCoupon handles magic coupon links, and withMagicLink handles our passwordless user authentication with Magic.
Almost all the pages on our site use all of those features. With this composition done in a higher order component, we can compose it into our container components with one line of code. Here’s what that would look like for our lesson page handler:
import LessonPage from '../features/lesson-pages/lesson-page.js'; import pageHOC from '../hocs/page-hoc.js';
export default pageHOC(LessonPage);
A common but miserable alternative to these kinds of HOCs is the pyramid of doom:
Repeat for every page. If you need to change this anywhere, you have to remember to change it everywhere. It should be self-evident why this sucks.
Leveraging composition for cross-cutting concerns is one of the best ways to reduce code complexity in your applications. The topic of composition is so important, I wrote a whole book on it: “Composing Software”.
Recap
Why React?Deterministic view renders, facilitated by unidirectional data binding, and immutable component state.
JSX provides easy, declarative markup in your JavaScript.
Synthetic events smooth over cross-platform events and reduce memory management headaches.
The component lifecycle exists to protect component state. It consists of mounting, updating, and unmounting, and the updating phase consists of render, pre-commit, and commit phases.
React hooks allow you to tap into the component lifecycle without using the class syntax, and also make it easier to share behaviors between components.
Container and Presentation Components allow you to isolate presentation concerns from state and effects, making both your components and business logic more reusable and testable.
Higher Order Components make it easy to share composable behaviors across many pages in your app in a way that your components don’t need to know about them (or be tightly coupled to them).
When you’ve got the foundations down and you’re ready to build real apps with React, Next.js and Vercel can automate the process of setting up your build configuration, CI/CD, and highly optimized, serverless deployment. It’s like having a full time DevOps team, but it actually saves you money instead of costing you full-time salaries.
Eric Elliott is a tech product and platform advisor, author of “Composing Software”, cofounder of EricElliottJS.com and DevAnywhere.io, and dev team mentor. He has contributed to software experiences for Adobe Systems, Zumba Fitness,The Wall Street Journal,ESPN,BBC, and top recording artists including Usher, Frank Ocean, Metallica, and many more.
He enjoys a remote lifestyle with the most beautiful woman in the world.
Fri Aug 28 2020 17:24:12 GMT+0700 (Western Indonesia Time)
“I don’t ascend high mountains, except because of love
And I don’t sing poetry, except as medicine”
Listen to one of the most moving poems in Arabic literature, where Majnun Layla expresses his pain over losing his lover – Layla. And listen to what Layla had to say in reply to him.
Sun Aug 23 2020 03:28:39 GMT+0700 (Western Indonesia Time)
Imru’ al-Qays, was known as the wandering king, because he spent his life seeking revenge, and the re-establishment of his father’s lost kingdom. He is sometimes referred to as the father of Arabic poetry, because he established many of the conventions and themes in Arabic poetry – which the poets after him followed.
However, he wasn’t always concerned about power and vengeance. He spent his youth as a ‘playboy’, chasing women and drinking.
What made him special is his way with words. He puts his experiences, emotions and pain into his mesmerizing poetry.
Wed Aug 19 2020 18:10:03 GMT+0700 (Western Indonesia Time)
I had the pleasure to be invited to speak at the HackingRio virtual conference in Rio de Janeiro. I participated in a panel about Israeli innovation together with my friends Ricardo Hechtman, Beny Rubinstein, Marcelo Treistman and Ricardo Lomaski.
Here is the video of the event (in Portuguese):
Special thanks to the HackingRio team that invited us and coordinated the panel: Lindalia Sofia Junqueira Reis, Rodolfo P. Lopes. and Bruna Petit.
Thu Aug 13 2020 06:41:18 GMT+0700 (Western Indonesia Time)
30 Essential Korean Irregular Verbs
You can take the practice course where you can review all the expressions above by listening and repeating along with the video lessons. Take the course now: 30 Essential Irregular Korean Verbs for Beginners
to help 돕다
돕다 to help
도와요. I help.
도와 주세요. Help me, please.
More examples
제가 도와 드릴게요. I will help you.
불우 이웃을 도와 주세요. Please help the neighbors in need.
친구는 서로 도와야 해요. Friends should be helping each other.
to be difficult 어렵다
어렵다 to be difficult
어려워요. It’s difficult.
이 문제 너무 어려워요. This question is so difficult.
More examples
어려운 문제 difficult question
이거 안 어려워요? Isn’t it difficult?
너무 어려워서 포기했어요. I gave up because it was too difficult.
to be easy 쉽다
쉽다 to be easy
쉬워요. It’s easy.
이거 너무 쉬워요? Is it too easy?
More examples
쉬운 시험 easy exam
이거 정말 쉬워요. This is really easy.
쉬울 줄 알았어요. I thought this would be easy.
to be cold 춥다
춥다 to be cold
추워요. It’s cold.
오늘 날씨 정말 추워요. It’s so cold today.
More examples
추운 날씨 cold weather
여기는 안 추워요. It’s not cold here.
이렇게 추운 날 어디 가요? Where are you going on this cold day?
to be hot 덥다
덥다 to be hot
더워요. It’s hot.
밖에 많이 더워요? Is it very hot outside?
More examples
더운 여름 hot summer
한국 여름은 너무 더워요. Korean summers are too hot.
방이 더우니까 에어컨 켜 주세요. Please turn on the air conditioner because it’s hot in the room.
to lie down 눕다
눕다 to lie down
누워요. I lie down.
이 침대에 누우세요. Lie down on this bed.
More examples
누웠어요? Did you lie down?
아기가 자려고 막 누웠어요. The baby just lay down to sleep.
여기 누우세요. Please lie down here.
to bake, to roast 굽다
굽다 to bake, to roast
구워요. I bake.
같이 빵 구울래요? Do you want to bake the bread together?
More examples
다 구웠어요. I’ve finished baking.
빵을 구웠는데 맛이 없어요. I baked the bread but it’s not good.
이것 좀 구워 줄래요? Could you please bake this?
to be spicy 맵다
맵다 to be spicy
매워요. It’s spicy.
매워서 못 먹겠어요. I can’t eat it because it’s too spicy.
More examples
매운 음식 spicy food
매운 거 잘 먹어요? Do you eat spicy food well?
이거 너무 매워요. This is too spicy.
to be beautiful 아름답다
아름답다 to be beautiful
아름다워요. It’s beautiful.
와, 꽃이 정말 아름다워요. Wow. the flowers are so beautiful.
More examples
아름다운 풍경 beautiful scenery
이 산은 가을 정말 아름다워요. This mountain is really beautiful in the fall.
오늘따라 더 아름다워 보이네요. You look extra beautiful today.
to be cute 귀엽다
귀엽다 to be cute
귀여워요. It’s cute.
아기가 정말 귀여워요. The baby is so cute.
More examples
귀여운 강아지 cute dog
너무 작고 귀여워요. It’s so small and cute.
너무 귀여워서 갖고 싶어요. It’s so cute that I want to keep it.
to choose 고르다
고르다 to choose
골라요. I choose.
하나만 골라요. Just pick one.
More examples
이거 골라도 돼요? Can I pick this one?
뭐 골랐어요? What did you choose?
골랐어요? Did you choose?
to be different 다르다
다르다 to be different
달라요. It’s different.
그 두 사람은 정말 달라요. Those two people are really different.
More examples
제 거랑 달라요. It’s different from mine.
상황에 따라 달라요. It is different depending on the situation.
그들과 우리는 달라요. They are different from us.
to not know 모르다
모르다 to not know
몰라요. I don’t know.
누가 했는지 저는 몰라요. I don’t know who did it.
More examples
저는 정말 몰라요. I really don’t know.
이 문제는 몰라서 못 풀었어요. I couldn’t solve this problem because I didn’t know.
몰라도 괜찮아요. It’s okay not to know.
to be fast 빠르다
빠르다 to be fast
빨라요. It’s fast.
비행기가 가장 빨라요. Airplanes are the fastest.
More examples
버스가 가장 빨라요. The bus is the fastest.
누가 더 빨라요? Who’s faster?
거기는 여기보다 2시간 더 빨라요. They’re 2 hours ahead of us.
to cut 자르다
자르다 to cut
잘라요. I cut.
이거 좀 잘라 주세요. Please cut this.
More examples
이렇게 잘랐어요. I cut it like this.
이거랑 똑같이 잘라 주세요. Please cut it exactly like this.
왜 이렇게 잘랐어요? Why did you cut it like this?
to raise, to grow 기르다
기르다 to raise, to grow
길러요. I grow it.
저는 허브를 길러요. I grow herbs.
More examples
저는 집에서 강아지를 걸러요. I raise a dog in my house.
그는 턱수염을 길러요. He has a beard.
애완동물을 길러 본 적 있어요? Have you ever raised an animal?
to be lazy 게으르다
게으르다 to be lazy
게을러요. I’m lazy.
제 남동생은 너무 게을러요. My brother is very lazy.
More examples
겨울이 되면 더 게을러 져요. When it’s winter, you become lazier.
그는 너무 게을러서 하루종일 잠만 잤어요. He is so lazy that he slept the whole day.
그 사람은 게을러서 해고 당했어요. He got fired because he was lazy.
to press 누르다
누르다 to press
눌러요. I press it.
지금 눌러요? Do I press now?
More examples
이 버튼 눌러도 돼요? Can I press this button?
구독 버튼 눌러 주세요. Please hit the subscribe button.
다시 들으시려면 1번을 눌러 주세요. If you want to listen again, press 1.
to listen, to hear 듣다
듣다 to listen, to hear
들어요. I hear.
제 말 좀 들어 보세요. Please listen to me.
More examples
그 소식 들었어요? Have you heard about the news?
잘 들어 보세요. Listen carefully.
들을 준비 됐어요? Are you ready to listen?
to walk 걷다
걷다 to walk
걸어요. I walk.
저는 학교에 걸어가요. I walk to my school.
More examples
걸을까요? Shall we walk?
걸어 왔어요? Did you walk here?
여기서 걸어서 10분 정도 걸려요. It takes about 10 minutes by walking.
to ask 묻다
묻다 to ask
물어요. I ask.
무엇이든지 물어보세요. Please ask me anything.
More examples
그런 거 물어보지 마세요. Don’t ask something like that.
물어봤어요? Have you asked?
저기에서 물어보세요. Ask there.
to load 싣다
싣다 to load
실어요. I load.
짐 다 실었어요? Have you finished loading the luggage?
More examples
차에 실은 짐 the luggage that is loaded in the car
배에 화물을 실었어요. I loaded cargo on a ship.
이것 좀 트럭에 실어 주세요. Please load this into the truck.
to recover, to get well 낫다
낫다 to recover, to get well
나아요. It gets well.
푹 쉬고 얼른 나아요. Get some rest and get well
More examples
다 나았어요? Did you fully recover?
드디어 제 팔이 다 나았어요. My arm is finally okay now.
시간이 지나면 다 나을 거예요. Time will help you get well.
to join, to connect 잇다
잇다 to join, to connect
이어요. I connect
이 두 점을 이어요. Connect the two dots.
More examples
파이프를 이었어요. I connected pipes together.
이 두 점을 이을 수 있을까요? Can we connect these two dots?
다시 한 번 더 이어 보세요. Please try to connect it once again.
to build 짓다
짓다 to build
지어요. I build.
이 집은 제가 직접 지었어요. I built this house myself.
More examples
다 지었어요? Did you finish building?
내년까지 다 지어야 해요. You should build it by next year.
그 건물은 나무로 지어 졌어요. The building was built of wood.
to pour 붓다
붓다 to pour
부어요. I pour
이제 물을 한 컵 부어요. Now, pour a cup of water.
More examples
이걸 다 부었어요? Did you pour it all?
이것만 부으면 끝나요. It will done oncebe end if you pour this.
샐러드 위에 드레싱 부어 주세요. Please pour the dressing over the salad.
to draw (a line) 긋다
긋다 to draw (a line)
그어요. I draw (a line)
여기에 선을 그어 보세요. Draw a line here.
More examples
누가 여기에 선을 그었어요? Who drew this line here?
가로로 선을 그어 주세요. Draw a horizontal line.
빨간색으로 밑줄을 그으세요. Underline it in red.
to be blue 파랗다
파랗다 to be blue
파래요. It’s blue.
하늘이 정말 파래요. The sky is really blue.
More examples
파란 하늘 blue sky
추워서 입술이 파래요. My lips are blue because it’s cold.
겨울 바다는 정말 파래요. The sea in the winter is really blue.
to be black 까맣다
까맣다 to be black
까매요. It’s black.
옷 색깔이 다 까매요. The clothes are all black.
More examples
까만 콩 black bean
방이 온통 까매요. The room is totally black.
다크 초콜렛은 정말 까매요. Dark chocolate is really dark.
to be like this 이렇다
이렇다 to be like this
이래요. It’s like this.
항상 이래요. It’s always like this.
More examples
이 시계 왜 이래요? What’s wrong with this watch?
어떻게 이래요? How can this be like this?
우리만 이래요? Is it only us like this?
Tue Aug 11 2020 15:31:10 GMT+0700 (Western Indonesia Time)
We take a look through the eyes of Arabic literature at the art of praising oneself. Some poets were shameless when it came to self-promotion. But is this a good idea? Are there lessons to be learned?
In this episode we will go through the poetry of Hatim at-Ta’iyy and Al-Mutanabbi said in Fakhr (self-exaltation)
Tue Aug 11 2020 14:29:57 GMT+0700 (Western Indonesia Time)
By Emily Bache
Or: is Given-When-Then Compulsory?
In BDD you discover what software you should build through a collaborative process involving both software developers and business people. BDD also involves a lot of test automation and tools like Cucumber and SpecFlow. But what would happen if you used an Approval testing tool instead? Would that still be BDD?
I’m a big fan of Behaviour Driven Development. I think it’s an excellent way for teams to gain a good understanding of what the end-user wants and how they will use the software. I like the emphasis on whole team collaboration and building shared understanding through examples. These examples can be turned into executable scenarios, also known as acceptance tests. They then become ‘living documentation’ that stays in sync with the system and helps everyone to collaborate over the lifetime of the software.
I wrote an article about Double-Loop TDD a while back, and I was thinking about BDD again recently in the context of Approval testing. Are they compatible? The usual tools for automating scenarios as tests are SpecFlow and Cucumber which both use the Gherkin syntax. Test cases comprise ‘Given-When-Then’ steps written in natural language and backed up by automation code. My question is – could you use an Approval testing tool instead?
I recently read a couple of books by Nagy and Rose. They are about BDD and specifically how to discover good examples and then formulate them into test cases. I thought the books did a good job of clearly explaining these aspects in a way that made them accessible to everyone, not just programmers.
Nagy and Rose are planning a third book in the series which will be more technical and go into more detail on how to implement the automation. They say that you can use other test frameworks, but in their books they deal exclusively with the Gherkin format and Cucumber family of tools. What would happen if you used an Approval testing tool? Would it still be BDD or would we be doing something else? Let’s go into a little more detail about the key aspects of BDD: discovery, formulation, and automation.
Discovery
The discovery part of BDD is all about developers talking with business stakeholders about what software to build. Through a structured conversation you identify rules and examples and unanswered questions. You can use an ‘example mapping’ workshop for that discussion outlined in this blog post by Cucumber Co-founder, Matt Wynne.
Formulation
The formulation part of BDD is about turning those rules and examples of system behaviour into descriptive scenarios. Each scenario is made as intelligible as possible for business people, consistent with the other scenarios, and unambiguous about system behaviour. There’s a lot of skill involved in doing this!
Automation
The automation part of BDD is where you turn formulated scenarios into executable test cases. Even though the automation is done in a programming language, the focus is still on collaboration with the business stakeholders. Everyone is expected to be able to read and understand these executable scenarios even if they can’t read a programming language.
Double-Loop TDD
The picture shown at the start of the article from Nagy and Rose’s Discovery BDD book emphasizes the double loop nature of the BDD automation cycle. The outer loop is about building the supporting code needed to make a formulated scenario executable. Test-Driven Development fits within it as the inner loop for implementing the system that fulfills the scenarios. In my experience the inner loop of unit tests goes round within minutes, whereas the outer loop can take hours or even days.
Later in the book they have a more detailed diagram showing an example BDD process:
This diagram is more complex, so I’m not going to explain it in depth here (for a deep dive take a look at this blog post by Seb Rose, or of course read the book itself!). What I want to point out is that the ‘Develop’ and ‘Implement’ parts of this diagram are showing double-loop TDD again, with slightly more detail than before. For the purpose of comparing a BDD process, with and without Approval testing, I’ve redrawn the diagram to emphasize those parts:
How you formulate, automate, and implement with TDD will all be affected by an approval testing approach. I recently wrote an article ”How to develop new features with Approval Testing, Illustrated with the Lift Kata”. That article goes through a couple of scenarios, how I formulate them as sketches, then automate them with an approval testing tool. Based on the process described in that article I could draw it like this:
What’s different?
“Formulate” is called “Sketch” since the method of formulation is visual rather than ‘Given-When-Then’. The purpose is the same though.
“Automate” includes writing a Printer as well as the usual kind of ‘glue’ code to access functionality in your application. A Printer can print the state of the software system in a format that matches the Sketch. The printer code will also evolve as you work on the implementation.
“Implement” is a slightly modified TDD cycle. With approval tests you still work test-driven and you still refactor frequently, but other aspects may differ. You may improve the Printer and approve the output many times before being ready to show the golden master to others for review.
“Review” – this activity is supposed to ensure the executable scenario is suitable to use as living documentation, and that business people can read it. The difference here is that the artifact being reviewed is the Approved Golden Master output, not the sketch you made in the “Formulate” activity. It’s particularly important to make sure business people are involved here because the living documentation that will be kept is a different artifact from the scenario they co-created in the ‘discover’ activities.
But is this still BDD?
I’m happy to report that, yes, this is still BDD! I hope you can see the activities are not that different. Just as importantly, the BDD community is open and welcoming of diversity of practice. This article describes BDD practitioners as forming a ‘centered’ community rather than a bounded community. That means people are open to you varying the exact practices and processes of BDD so long as you uphold some common values. The really central part of BDD is the collaborative discovery process.
In this article I hope I’ve shown that using an approval testing approach upholds that collaborative discovery process. It modifies the way you do formulation, automation, and development, but in a way that retains the iterative, collaborative heart of BDD. For some kinds of system sketches and golden masters might prove to be easier for business people to understand than the more mainstream ‘Given-When-Then’ Gherkin format. In that case an approval testing tool might enable a better collaborative discovery process and propel you closer to the centre of BDD.
Conclusions
BDD is about a lot more than test automation, and Gherkin is not the only syntax you can use for that part. Approval testing is perfectly compatible with BDD. I’m happy I can both claim to be a member of the BDD community and continue to choose a testing tool that fits the context I’m working in. If you’d like to learn more about Approval testing check out this video of me pair programming with Adrian Bolboaca.
Tue Aug 04 2020 12:54:39 GMT+0700 (Western Indonesia Time)
Authentication is hard. Even if you know the ins and outs of it, handling registration, login, email verification, forgotten password, secret rotation... and what not... is a tedious work.
For this reason, we use auth providers such as AWS Cognito or Auth0. But this comes with its own drawback, namely that you are at the provider's mercy when it comes to examples and tutorials. If a resource you need does not exist, you either need to contact support and wait for them (but nobody got time for that), or figure it out yourself by the good ol' trial and error method.
A couple of days ago, I had to use Auth0 with Vue.js and TypeScript. Now, Auth0 has an excellent tutorial for Vue.js, but I could not find any examples in TypeScript. So seeing no better option, I started annotating the code provided by the tutorial.
I finished it, and in this blogpost, I'll walk you through the details, so you don't have to repeat this chore.
We will follow the original Auth0 Vue tutorial structure which can be found here. To make it easier to compare the two, we'll use the exact same first-level headings as the original.
First, you'll need to set up your Auth0 application. That part is very well written in the original tutorial, and I would like to be neither repetitive nor plagiarize Auth0's content, so please go ahead and read the first section there, then come back.
Create a Sample Application
Now we already start to diverge from the Auth0 tutorial.
If you already have an existing app, make sure that typescript, vue-class-component, and vue-property-decorator are present in your package.json, as we'll use class components.
If you don't have one, let's create a sample app.
$ vue create auth0-ts-vue
When prompted, select Manually select features.
We'll need Babel, TypeScript, and Router.
The next 3 questions are about deciding whether you want to use class-style component syntax, Babel, and history mode. Hit enter for all three to answer "Yes". You might opt-out from history mode if you really want to.
It is entirely up to you if you want to use dedicated config files or not, and if you want to save this as a preset.
Grab a beverage of your preference while the dependencies are being installed.
Install the SDK
Once it's done, we need to install our auth0 dependencies.
$ cd auth0-ts-vue-example
$ npm install @auth0/auth0-spa-js
The auth0-spa-js package comes with its own type definitions, so we're all set for now.
Modify your Webpack Config
If you followed the original Auth0 tutorials configuration part, you've set up your URLs to listen at port 3000. Time to hard code this into our webpack dev-server.
Create a vue.config.js file in the root directory of your app.
This way, we don't have to specify the PORT env var when we run our app. We'd need to change it in Auth0 anyway all the time, while we're developing it.
Start the application
$ npm run serve
Leave it running so we can leverage Webpack's incremental build throughout the process.
Create an Authentication Wrapper
Have you ever created a Vue.js plugin? Well, now is the time!
The easiest way to use Auth0 in your app is to make it available on this in each of your components, just as you do with $route after you've installed Vue Router.
It would be nice if this was a separate dependency, but for the sake of simplicity, let it live inside our codebase.
Create a directory called auth inside your src dir then create the following files: index.tsauth.ts, VueAuth.ts, User.ts. The original tutorial has them all in one file. Still, in my opinion, it is easier to understand what's happening if we separate the matters a bit, and it also results in nicer type definitions too.
Our index.ts will be a simple barrel file.
export * from './auth'
auth.ts is where we define the plugin. VueAuth.ts is a wrapper Vue object around auth0-spa-js, so we can leverage the observability provided by Vue, and User.ts is a class to make its type definition nicer.
Defining our User
Let's go from the inside out and take a look at User.ts
Now, this requires a bit of explanation. The first block of fields are the one that are always present, no matter what login scheme the user used. Sub is the OpenID ID Token's Subject Identifier, which contains the authentication provider (eg. auth0 or google) and the actual user id, separated by a |. The other mandatory fields are probably self-explanatory.
Next are provider and id, which are a result of splitting sub, so they should be there, but we cannot be sure. The last are the ones that were only present when Google OAuth is used as the provider. There might be more, depending on what connections you set up and what other data you request. Or you could even code custom fields in the returned ID Token... but I digress.
Last we tell TypeScript, that we want to be able to use the bracket notation on our object by adding [key: string]: any
Our constructor takes a raw user object with similar fields but snake_cased. That's why we camelCase them and assign each of them to our User object. Once we're done, we extract the provider and the id from the subfield.
Show me the Wrapper
Time to take a look at VueAuth.ts
import { Vue, Component } from 'vue-property-decorator'
import createAuth0Client, { PopupLoginOptions, Auth0Client, RedirectLoginOptions, GetIdTokenClaimsOptions, GetTokenSilentlyOptions, GetTokenWithPopupOptions, LogoutOptions } from '@auth0/auth0-spa-js'
import { User } from './User'
export type Auth0Options = {
domain: string
clientId: string
audience?: string
[key: string]: string | undefined
}
export type RedirectCallback = (appState) => void
@Component({})
export class VueAuth extends Vue {
loading = true
isAuthenticated? = false
user?: User
auth0Client?: Auth0Client
popupOpen = false
error?: Error
async getUser () {
return new User(await this.auth0Client?.getUser())
}
/** Authenticates the user using a popup window */
async loginWithPopup (o: PopupLoginOptions) {
this.popupOpen = true
try {
await this.auth0Client?.loginWithPopup(o)
} catch (e) {
console.error(e)
this.error = e
} finally {
this.popupOpen = false
}
this.user = await this.getUser()
this.isAuthenticated = true
}
/** Authenticates the user using the redirect method */
loginWithRedirect (o: RedirectLoginOptions) {
return this.auth0Client?.loginWithRedirect(o)
}
/** Returns all the claims present in the ID token */
getIdTokenClaims (o: GetIdTokenClaimsOptions) {
return this.auth0Client?.getIdTokenClaims(o)
}
/** Returns the access token. If the token is invalid or missing, a new one is retrieved */
getTokenSilently (o: GetTokenSilentlyOptions) {
return this.auth0Client?.getTokenSilently(o)
}
/** Gets the access token using a popup window */
getTokenWithPopup (o: GetTokenWithPopupOptions) {
return this.auth0Client?.getTokenWithPopup(o)
}
/** Logs the user out and removes their session on the authorization server */
logout (o: LogoutOptions) {
return this.auth0Client?.logout(o)
}
/** Use this lifecycle method to instantiate the SDK client */
async init (onRedirectCallback: RedirectCallback, redirectUri: string, auth0Options: Auth0Options) {
// Create a new instance of the SDK client using members of the given options object
this.auth0Client = await createAuth0Client({
domain: auth0Options.domain,
client_id: auth0Options.clientId, // eslint-disable-line @typescript-eslint/camelcase
audience: auth0Options.audience,
redirect_uri: redirectUri // eslint-disable-line @typescript-eslint/camelcase
})
try {
// If the user is returning to the app after authentication..
if (
window.location.search.includes('error=') ||
(window.location.search.includes('code=') && window.location.search.includes('state='))
) {
// handle the redirect and retrieve tokens
const { appState } = await this.auth0Client?.handleRedirectCallback() ?? { appState: undefined }
// Notify subscribers that the redirect callback has happened, passing the appState
// (useful for retrieving any pre-authentication state)
onRedirectCallback(appState)
}
} catch (e) {
console.error(e)
this.error = e
} finally {
// Initialize our internal authentication state when the page is reloaded
this.isAuthenticated = await this.auth0Client?.isAuthenticated()
this.user = await this.getUser()
this.loading = false
}
}
}
It might make sense to compare this with the original tutorial.
In the original tutorial, a Vue object is created while we're creating a class to make its annotation easier. There you can find it as:
// The 'instance' is simply a Vue object
instance = new Vue({
...
})
Now let's unpack it.
First, we need to import a couple of types, including our User class.
Then we create the Auth0Options and RedirectCallback type aliases for convenience.
Instead of creating a simple Vue object, we define a Class Component. The public fields are the same as the data object in the original, whereas the static ones are the parameters passed to the plugin.
We differ in two substantial way from the original tutorial:
We have one less method: handleRedirectCallback is not used anywhere in the original, so we omitted it.
Instead of setting up the Auth0 Client in the Vue object's created hook, we use a separate method called init. Aside from that, the contents of the two are identical.
The reason for using a separate method is simple: The created hook is used in place of a constructor when it comes to Class Components, as the constructor of the class is usually called by Vue.
First, a component object is created just like when using Vue({}), passing it the data, methods, watchers, paramlist, and all the things we usually define for components. When this is done, the created hook is called. Later, when the component is actually used and rendered, the params are passed to it, and mounted, or updated.
The problem with the original one is that we cannot pass parameters to the created method. Neither can we write a proper constructor. So we need to have our own method we will call right after the object is instantiated just as it's done with created by Vue.
Let's dissect init a bit.
First, we create and auth0Client.
Then, in the try-catch block, we check if the user is returning after authentication and handle it. We check if the query params contain any signs of redirection. If they do, we call auth0Client.handleRedirectCallback, which parses the URL and either rejects with an error or resolves with and appState.
Then, we pass on the appState to onRedirectCallback. This is a function we can pass to the plugin when we install it to Vue, so we can handle the app level ramifications of a login.
For the other methods, getUser is a simple wrapper around the authClient's getUser method. We pass on the resolved promise to our User's constructor to create a nicely looking User object.
Next, there is loginWithPopup, which we won't use, as popups can be blocked by browsers. So we'll go with the redirect way, where the user is redirected to Auth0, login, then the callback URL is called by Auth0 passing information to our app in the callback URL's query.
The information in the URL is parsed by auth0Client.handleRedirectCallback which will return a Promise<RedirectCallbackResult>. The Promise will be rejected if there is an error in the authentication flow.
We have a couple of simple wrappers around the auth0Client. loginWithRedirect initiates the flow I described above, logout speaks for itself.
Finally, we set up the user and check if we're authenticated.
Let's turn this into a Plugin
Now, all we need to do is create a proper plugin.
If you take a look at Vue's documentation about plugins, you'll see that we need to create an object that exposes an install method. This method will be called when we pass the object to Vue.use and it will receive the Vue constructor and optionally... options.
In our install method, we add an $auth member to any Vue object, so the VueAuth object is available everywhere, just as vue-router is.
Let's implement the useAuth function.
/** Define a default action to perform after authentication */
const DEFAULT_REDIRECT_CALLBACK = () =>
window.history.replaceState({}, document.title, window.location.pathname)
let instance: VueAuth
/** Returns the current instance of the SDK */
export const getInstance = () => instance
/** Creates an instance of the Auth0 SDK. If one has already been created, it returns that instance */
export const useAuth0 = ({
onRedirectCallback = DEFAULT_REDIRECT_CALLBACK,
redirectUri = window.location.origin,
...options
}) => {
if (instance) return instance
// The 'instance' is simply a Vue object
instance = new VueAuth()
instance.init(onRedirectCallback, redirectUri, options as Auth0Options)
return instance
}
useAuth returns a singleton VueAtuh instance, and extracts the onRedirectCallback and redirectUri from the options object. What's left is an Auth0Options type which we'll pass on straight to the auth0Client.
You can see the init method in action we created earlier. Then VueAuth is instantiated if it hasn't been already. Above that, we also expose a getInstance function, in case we need to use it outside of a Vue component.
Let's see here the whole auth.ts for your copy-pasting convenience:
import { VueConstructor } from 'vue'
import { VueAuth, Auth0Options, RedirectCallback } from './VueAuth'
type Auth0PluginOptions = {
onRedirectCallback: RedirectCallback,
domain: string,
clientId: string,
audience?: string,
[key: string]: string | RedirectCallback | undefined
}
/** Define a default action to perform after authentication */
const DEFAULT_REDIRECT_CALLBACK = (appState) =>
window.history.replaceState({}, document.title, window.location.pathname)
let instance: VueAuth
/** Returns the current instance of the SDK */
export const getInstance = () => instance
/** Creates an instance of the Auth0 SDK. If one has already been created, it returns that instance */
export const useAuth0 = ({
onRedirectCallback = DEFAULT_REDIRECT_CALLBACK,
redirectUri = window.location.origin,
...options
}) => {
if (instance) return instance
// The 'instance' is simply a Vue object
instance = new VueAuth()
instance.init(onRedirectCallback, redirectUri, options as Auth0Options)
return instance
}
// Create a simple Vue plugin to expose the wrapper object throughout the application
export const Auth0Plugin = {
install (Vue: VueConstructor, options: Auth0PluginOptions) {
Vue.prototype.$auth = useAuth0(options)
}
}
As you can see, we're extending the Vue constructor with a new instance member. If we try to access it in a component, the TypeScript compiler will start crying as it has no idea what happened. We'll fix this a bit later down the line.
Now, the Auth0Options are the ones that are needed for the client to identify your tenant. Copy the Client ID and Domain from your Auth0 applications settings and store them in a file called auth.config.json for now. It would be nicer to inject them as environment variables through webpack, but as these are not sensitive data, we'll be just fine like that as well.
With all that said, I will not include my auth.config.json in the reference repo, only an example you'll need to fill in with your data.
Make sure to add "resolveJsonModule": true, to your tsconfig.json.
Finally, we're ready to create our main.ts.
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import { Auth0Plugin } from './auth'
import { domain, clientId } from '../auth.config.json'
Vue.use(Auth0Plugin, {
domain,
clientId,
onRedirectCallback: (appState) => {
router.push(
appState && appState.targetUrl
? appState.targetUrl
: window.location.pathname
)
}
})
Vue.config.productionTip = false
new Vue({
router,
render: h => h(App)
}).$mount('#app')
The onRedirectCallback redirects the user to a protected route after they have authenticated. We'll cover this a bit later when we create an actual protected route.
Log in to the App
Time to put the authentication logic to use.
First, we'll add a Login / Logout button to Home.vue
<template>
<div class="home">
<img alt="Vue logo" src="../assets/logo.png" />
<HelloWorld msg="Welcome to Your Vue.js App" />
<!-- Check that the SDK client is not currently loading before accessing is methods -->
<div v-if="!$auth.loading">
<!-- show login when not authenticated -->
<button v-if="!$auth.isAuthenticated" @click="login">Log in</button>
<!-- show logout when authenticated -->
<button v-if="$auth.isAuthenticated" @click="logout">Log out</button>
</div>
</div>
</template>
We'll also need to update the logic in the script tag of Home
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import HelloWorld from '@/components/HelloWorld.vue'
@Component({
components: {
HelloWorld
}
})
export default class Home extends Vue {
login () {
this.$auth.loginWithRedirect({})
}
// Log the user out
logout () {
this.$auth.logout({
returnTo: window.location.origin
})
}
}
</script>
First, we turn the original example component into a Class Component. Second, the methods simply call the methods of VueAuth exposed by our Auth0Plugin.
But what's that? this.$auth is probably underlined in your IDE. Or if you try to compile the code you'll get the following error:
Of course, we still have to tell the compiler that we have augmented the Vue constructor with our $auth member.
Let's create a shims-auth0.d.ts file in our src directory. If you're using VSCode, you might need to reload the window to make the error go away.
Now, let's try to compile our code. If you have configured your Auth0 credentials correctly, you should be redirected to the Auth0 Universal Login page when you click Login, and back to your app against once you have logged in.
Then, you should be able to click Log out and have the application log you out.
Display the User's Profile
So far so good, but let's try to create a protected route. Displaying the user's profile seems like a prime target for that.
Let's create a file called Profile.vue in src/views.
The code should compile, so let's check if we can navigate to the Profile page and see the data. For added profit, try logging in with both Google and register a username and password. Take note of the data you get.
Secure the Profile Page
We have the route, time to make it protected. Let's create a new file in src/auth called authGaurd.ts.
import { getInstance } from './auth'
import { NavigationGuard } from 'vue-router'
export const authGuard: NavigationGuard = (to, from, next) => {
const authService = getInstance()
const fn = () => {
// Unwatch loading
unwatch && unwatch()
// If the user is authenticated, continue with the route
if (authService.isAuthenticated) {
return next()
}
// Otherwise, log in
authService.loginWithRedirect({ appState: { targetUrl: to.fullPath } })
}
// If loading has already finished, check our auth state using `fn()`
if (!authService.loading) {
return fn()
}
// Watch for the loading property to change before we check isAuthenticated
const unwatch = authService.$watch('loading', (loading: boolean) => {
if (loading === false) {
return fn()
}
})
}
First, we put auth.ts's getInstance to use. Then we create a function that checks if the user is authenticated. If they are, we call next, otherwise redirect them to login.
However, we should only call this function, if the authService is not loading, as otherwise, we still don't have any settled information about the login process.
If it is still loading, we set up a watcher for authService.loading, so when it turns true, we call our guard function. Also, please notice that we use the unwatch function returned by $watch to clean up after ourselves in fn.
I personally prefer giving descriptive names to my functions, but I only wanted to change things for the sake of either type annotation, or stability, so forgive me for keeping fn as it is to maintain parity with the JS tutorial.
Guidance with Auth0, Vue & TypeScript
Auth0 and all other authentication providers relieve us from the tedious job of handling user management ourselves. Auth0 itself excels in having a lot of educational resources for their users. The original Vue tutorial was really helpful, but seeing that TypeScript is becoming the industry standard when it comes to writing anything that should be run by JavaScript runtimes, it would be nice to see more TypeScript tutorials.
I hope this article manages to fill in a bit of this gap. If you liked what you just read, please share it with those who might need guidance with Auth0, Vue & TypeScript!
Tue Aug 04 2020 12:14:45 GMT+0700 (Western Indonesia Time)
Listen to this Bizarre story from the pre-Islamic period where a war was fought for over 40 years between the tribes of Taghlib and Bakr over the killing of a camel. Listen to the stories of Kulayb, Jassas, Zir Salim, al-Harith ibn Ubad and more.
Sun Jul 12 2020 04:54:59 GMT+0700 (Western Indonesia Time)
An introduction to the Mu’allaqat or the Hanging odes. These are 7 poems that represent the finest of pre-Islamic Arabic poetry. The study of pre-Islamic poetry offers much insight into the language and the depth of its meanings and usages.
Tue Jul 07 2020 15:22:34 GMT+0700 (Western Indonesia Time)
Many of you have probably used apache Jmeter for load testing before. Still, it is easy to run into the limits imposed by running it on just one machine when trying to make sure that our API will be able to serve hundreds of thousands or even millions of users.
We can get around this issue by deploying and running our tests to multiple machines in the cloud.
In this article, we will take a look at one way to distribute and run Jmeter tests along multiple droplets on DigitalOcean using Terraform, Ansible, and a little bit of bash scripting to automate the process as much as possible.
Background: During the COVID19 outbreak induced lockdowns, we’ve been tasked by a company (who builds an e-learning platform primarily for schools) to build out an infrastructure that is:
geo redundant,
supports both single and multi tenant deployments ,
can be easily scaled to serve at least 1.5 million users in huge bursts,
and runs on-premises.
To make sure the application is able to handle these requirements, we needed to set up the infrastructure, and model a reasonably high burst in requests to get an idea about the load the application and its underlying infrastructure is able to serve.
In this article, we’ll share practical advice and some of the scripts we used to automate the load-testing process using Jmeter, Terraform and Ansible.
Why do we use Jmeter for distributed load testing?
Jmeter is not my favorite tool for load testing owing mostly to the fact that scripting it is just awkward. But looking at the other tools that support distribution, it seems to be the best free one for now. K6 looks good, but right now it does not support distribution outside the paid, hosted version. Locust is another interesting one, but it's focusing too much on random test picking, and if that's not what I'm looking for, it is quite awkward to use as well - just not flexible enough right now.
So, back to Jmeter!
Terraform is infrastructure as code, which allows us to describe the resources we want to use in our deployment and configure the droplets so we have them ready for running some tests. This will, in turn, be deployed by Ansible to our cloud service provider of choice, DigitalOcean - though with some changes, you can make this work with any other provider, as well as your on-premise machines if you wish so.
Deploying the infrastructure
There will be two kinds of instances we'll use:
primary, of which we'll have one coordinating the testing,
and runners, that we can have any number of.
In the example, we're going to go with two, but we'll see that it is easy to change this when needed.
You can check the variables.tf file to see what we'll use. You can use these to customise most aspects of the deployment to fit your needs. This file holds the vars that will be plugged into the other template files - main.tf and provider.tf.
The one variable you'll need to provide to Terraform for the example setup to work is your DigitalOcean api token, that you can export like this from the terminal:
export TF_VAR_do_token=DO_TOKEN
Should you wish to change the number of test runner instances, you can do so by exporting this other environment variable:
export TF_VAR_instance_count=2
You will need to generate two ssh key pairs, one for the root user, and one for a non-privileged user. These will be used by Ansible, which uses ssh to deploy the testing infrastructure as it is agent-less. We will also use the non-privileged user when starting the tests for copying over files and executing commands on the primary node. The keys should be set up with correct permissions, otherwise, you'll just get an error.
Set the permissions to 600 or 700 like this:
chmod 600 /path/to/folder/with/keys/*
To begin, we should open a terminal in the terraform folder, and call terraform init which will prepare the working directory. Thisl needs to be called again if the configuration changes.
You can use terraform plan that will output a summary of what the current changes will look like to the console to double-check if everything is right. At the first run, it will be what the deployment will look like.
Next, we call terraform apply which will actually apply the changes according to our configuration, meaning we'll have our deployment ready when it finishes! It also generates a .tfstate file with all the information about said deployment.
If you wish to dismantle the deployment after the tests are done, you can use terraform destroy. You'll need the .tfstate file for this to work though! Without the state file, you need to delete the created droplets by hand, and also remove the ssh key that has been added to DigitalOcean.
Running the Jmeter tests
The shell script we are going to use for running the tests is for convenience - it consists of copying the test file to our primary node, cleaning up files from previous runs, running the tests, and then fetching the results.
#!/bin/bash
set -e
# Argument parsing, with options for long and short names
for i in "$@"
do
case $i in
-o=*|--out-file=*)
# i#*= This removes the shortest substring ending with
# '=' from the value of variable i - leaving us with just the
# value of the argument (i is argument=value)
OUTDIR="${i#*=}"
shift
;;
-f=*|--test-file=*)
TESTFILE="${i#*=}"
shift
;;
-i=*|--identity-file=*)
IDENTITYFILE="${i#*=}"
shift
;;
-p=*|--primary-ip=*)
PRIMARY="${i#*=}"
shift
;;
esac
done
# Check if we got all the arguments we'll need
if [ -z "$TESTFILE" ] || [ ! -f "$TESTFILE" ]; then
echo "Please provide a test file"
exit 1
fi
if [ -z "$OUTDIR" ]; then
echo "Please provide a result destination directory"
exit 1
fi
if [ -z "$IDENTITYFILE" ]; then
echo "Please provide an identity file for ssh access"
exit 1
fi
if [ -z "$PRIMARY" ]; then
PRIMARY=$(terraform output primary_address)
fi
# Copy the test file to the primary node
scp -i "$IDENTITYFILE" -o IdentitiesOnly=yes -oStrictHostKeyChecking=no "$TESTFILE" "runner@$PRIMARY:/home/runner/jmeter/test.jmx"
# Remove files from previous runs if any, then run the current test
ssh -i "$IDENTITYFILE" -o IdentitiesOnly=yes -oStrictHostKeyChecking=no "runner@$PRIMARY" << "EOF"
rm -rf /home/runner/jmeter/result
rm -f /home/runner/jmeter/result.log
cd jmeter/bin ; ./jmeter -n -r -t ../test.jmx -l ../result.log -e -o ../result -Djava.rmi.server.hostname=$(hostname -I | awk ' {print $1}')
EOF
# Get the results
scp -r -i "$IDENTITYFILE" -o IdentitiesOnly=yes -oStrictHostKeyChecking=no "runner@$PRIMARY":/home/runner/jmeter/result "$OUTDIR"
Running the script will require the path to the non-root ssh key. The call will look something like this:
You can also supply the IP of the primary node using -p= or --primary-ip= in case you don't have access to the .tfstate file. Otherwise, the script will ask terraform for the IP.
Jmeter will then take care of distributing the tests across the runner nodes, and it will aggregate the data when they finish. The only thing we need to keep in mind is that the number of users we set for our test to use will not be split but will be multiplied. As an example, if you set the user count to 100, each runner node will then run the tests with 100 users.
And that's how you can use Terraform and Ansible to run your distributed Jmeter tests on DigitalOcean!
Check this page for more on string manipulation in bash.
Looking for DevOps & Infra Experts?
In case you’re looking for expertise in infrastructure related matters, I’d recommend to read our articles and ebooks on the topic, and to check out our various service pages:
Wed Jul 01 2020 09:16:09 GMT+0700 (Western Indonesia Time)
Learn Korean with a web drama!
사랑, 기억에 머물다 is a web drama about mind-reading technology and love, and features a member of the popular Korean girl group Apink (에이핑크). You can learn very useful real-life Korean expressions through engaging episodes!
This is the part 2 of the drama course containing 11 lessons.
Wed Jul 01 2020 09:06:31 GMT+0700 (Western Indonesia Time)
Learn Korean with a web drama!
사랑, 기억에 머물다 is a web drama about mind-reading technology and love, and features a member of the popular Korean girl group Apink (에이핑크). You can learn very useful real-life Korean expressions through engaging episodes!
This is the part 1 of the drama course containing 11 lessons.
The main phrase of this lesson: 그래. 다 그런 거지 뭐. 겉과 속이 다른 세상. 참…
그래. = Yes. / That’s right. 다 그런 거지. = Sure, it’s like that. 뭐 = adds a sense of giving up or low expectations 겉과 속이 다른 세상 = a world where people are different inside and outside 참 = sigh
Lesson 2
The main phrase of this lesson: 네가 이렇게 미안해 할 줄 알고, 내가 네 이름으로 좀 먹었다.
네가 = you 이렇게 = like this 미안해 하다 = to feel apologetic 네 이름으로 = under your name 좀 = a little bit
Lesson 3
The main phrase of this lesson: 나 여기 단골인데… 왜 몰랐지?
나 = I 여기 = here, this place 단골 = regular customer 왜 = why 모르다 = to not know
Lesson 4
The main phrase of this lesson: 지금 입맛이 별로 없어. 그리고 이게 뭐 하루 이틀이냐.
지금 = now 입맛 = appetite 별로 = not particularly 그리고 = and 하루 = one day 이틀 = two days
Lesson 5
The main phrases of this lesson: 샤워하고 나오잖아? 뽀샤시해 가지고 기가 막히게 예뻐요. 청순하고.
샤워하다 = to take a shower 뽀샤시하다 = to have perfect skin, to glow 기가 막히게 = amazingly, breathtakingly 예쁘다 = to be pretty 청순하다 = to have innocent beauty
Lesson 6
The main phrase of this lesson: 뭐야? 추운데 왜 길거리에서 저러고 있는 거야?
뭐야? = What is it? 춥다 = to be cold 왜 = why 길거리 = street 저러고 = 저렇게 하고 = like that
Lesson 7
The main phrase of this lesson: 분명 있었는데… 내가 잘못 본 건가?
분명 = definitely, certainly 있다 = to exist, to be there 있었는데 = they were there but 잘못 = incorrectly 보다 = to see
Lesson 8
The main phrase of this lesson: 이야, 여기 다녀? 우리 진짜 인연인가 보네.
이야. = Wow. 여기 = here 다니다 = to go regularly, to attend 우리 = we 진짜 = really 인연 = destiny, meant to be together, meant to meet -인가 보네 = I guess it is, it seems to be
Lesson 9
The main phrases of this lesson: 인상착의는 기억나세요? / 그게 밤이라… 또 너무 어두워 가지고… 잘….
인상 = what someone looks like 착의 = what someone is wearing 인상착의 = appearance 기억나다 = to remember 그게 = The thing is… 밤 = night -이라(서) = because 또 = also 너무 = very, too 어둡다 = to be dark 잘 = well, skillfully
Lesson 10
The main phrase of this lesson: 야, 나 오늘 짤리는 거 아닌가 조마조마했거든. 엄청 잘 됐지?
야 = hey 오늘 = today 짤리다 (잘리다) = to be cut, to be fired -는 거 아닌가 = perhaps I will, maybe I will 조마조마하다 = to be nervous 엄청 = very, really 잘 되다 = to go well, to be good news
Lesson 11
The main phrase of this lesson: 아주 잘 하는 짓이다.
아주 = very 잘 = well 하다 = do 짓 = deed, doing, action
Wed Jul 01 2020 04:03:12 GMT+0700 (Western Indonesia Time)
Are you considering the idea of learning Korean?
First of all, you are absolutely at the right place to do. And second of all, we have a video for you that will save you a lot of time.
The general sentence structure and order order in the Korean language can be quite different from English, because verbs generally come at the very end.
Understanding how Korean sentences are formed in general will help you navigate better through the Korean language. Once you are done with the video lesson above, you are ready to start learning more Korean! Even if you have no prior knowledge of the Korean language, we have everything you need to learn to speak Korean. You can start learning with our paper books, e-books or online courses that you can take on the go!
Sat Jun 27 2020 00:05:58 GMT+0700 (Western Indonesia Time)
How 10x Developers Produce 10x Value
Is there a shortcut to becoming a 10x developer? Is there some magical secret that — if you only knew it — would unlock a whole new world of software development mastery and productivity for you?
This is where the doubters are thinking “There are no shortcuts! Everybody needs to practice to get good!” And that’s true enough, but what are the experts of software productivity practicing, and is there one key thing that can make a huge difference?
Yes! There is!
But even if I share it with you — even if I give it away and spell it out for you in detail— it might take you 10 years to grow into and fully appreciate the simplicity of it.
At least, that’s what happened to me. It was spelled out to me in plain English by my high school programming teacher. I was walked step-by-step through the process of applying it using some example code. And it didn’t really sink in until 10 years later. But now, with the benefit of experience, it’s a lesson I appreciate profoundly, and even though I know it’s a lesson you can’t truly appreciate at first glance — I’m going to share it with you.
This secret is a key difference between average productivity and 10x productivity. Using the leverage that this secret provides, you can be orders of magnitude more efficient.
You can write code that is more reusable and less likely to break when new requirements are introduced and things change in the surrounding code.
The secret to being 10x more productive is to gain a mastery of abstraction. A lot of developers treat “abstraction” like it’s a dirty word. You’ll hear (otherwise good) advice like, “don’t abstract too early” or Zen of Python’s famous “explicit is better than implicit,” implying that concrete is better than abstract. And all of that is good advice — depending on context.
But modern apps use a huge amount of code. If you printed out the source code of modern top 10 applications, those stacks of paper would compete with the height of skyscrapers, and software costs a lot of money to maintain. The more code you create, the more it costs.
Abstraction is the Key to Simple Code
The right abstractions can make code more readable, adaptable, and maintainable by hiding details which are unimportant for the current context, and reducing the amount of code required to do the same work — often by orders of magnitude.
“Simplicity is about subtracting the obvious and adding the meaningful.”
Abstraction is not a 1-way street. It’s really formed by two complementary concepts:
Generalization — Removing the repeated parts (the obvious) and hiding them behind an abstraction.
Specialization — Applying the abstraction for a particular use-case, adding just what needs to be different (the meaningful).
Consider the following code:
There’s nothing inherently wrong with the code, but it contains a lot of details that may not be important for this particular application.
It includes details of the container/transport data structure being used (the array), meaning that it will only work with arrays. It contains a state shape dependency.
It includes the iteration logic, meaning that if you need other operations which also need to visit each element in the data structure, you’d need to repeat very similar iteration logic in that code, as well. It forces repetition which could violate DRY (Don’t Repeat Yourself).
It includes an explicit assignment, rather than declaratively describing the operation to be performed. It’s verbose.
None of that is necessary. All of it can be hidden behind an abstraction. In this case, an abstraction that is so universal, it has transformed the way modern applications are built and reduced the number of explicit for-loops we need to write.
“If you touch one thing with deep awareness, you touch everything.”
~ Thich Nhat Hanh
Using the map operation, we can reduce the code to a one-liner by removing the obvious (the parts we’re likely to repeat in similar code), and focusing on the meaningful (just the stuff that needs to be different for our use case:
Junior developers think they have to write a lot of code to produce a lot of value.
Senior developers understand the value of the code that nobody needed to write.
Imagine being the coder who popularized the use of the map operation in programming languages like JavaScript. Map abstracts away details such as the type of data you’re mapping over, the type of data structure containing the data, and the iteration logic required to enumerate each data node in the data structure. It’s improved the efficiency of every app I’ve built in the past decade.
Jeremy Ashkenas made several such operations popular in JavaScript, and paved the way for many of the great syntax shortcuts we take for granted now in JavaScript by pioneering their use in CoffeeScript. He made Underscore, which spawned Lodash (still the most popular functional programming utility belt in JavaScript), and Backbone, which popularized MVC architecture in JavaScript and set the stage for Angular and React.
John Resig made jQuery, which was so popular and influential, it formed the biggest collection of reusable, encapsulated JavaScript modules (jQuery plugins) until standard Node modules and ES6 modules appeared several years later. jQuery’s selector API was so influential it forms the basis of today’s DOM selection APIs. I still benefit on a nearly daily basis from jQuery’s selection API when I unit test React components.
The right abstractions are powerful levers that can impact productivity dramatically. Abstraction is not a dirty word. Modules, functions, variables, classes — all of these are forms of abstraction and the entire reason any of them exist is to make abstraction and composition of abstractions easier.
You can’t build complex software without abstractions. Even assembly language uses abstractions — names for instructions, variables for memory addresses, code points to jump to for subroutines (like function calls), etc. Modern software is a layer cake of useful abstractions, and those layers give you leverage.
“Give me a lever long enough and a fulcrum on which to place it, and I shall move the world.”
~ Archimedes
The key to simplicity: The secret we’re after — is how to reduce the mountain of code we’re producing — how to get a lot more done with a lot less. When you master that, you will be a 10x programmer. I guarantee it.
Eric Elliott is a tech product and platform advisor, author of “Composing Software”, cofounder of EricElliottJS.com and DevAnywhere.io, and dev team mentor. He has contributed to software experiences for Adobe Systems, Zumba Fitness,The Wall Street Journal,ESPN,BBC, and top recording artists including Usher, Frank Ocean, Metallica, and many more.
He enjoys a remote lifestyle with the most beautiful woman in the world.
The Secret of Simple Code was originally published in JavaScript Scene on Medium, where people are continuing the conversation by highlighting and responding to this story.
Thu Jun 04 2020 23:48:06 GMT+0700 (Western Indonesia Time)
Redux is an amazing tool if you take the time to get to know it. One of the things about Redux that commonly trips people up is that reducers must be pure functions.
A pure function is a function which:
Given same arguments, always returns the same result, and
Has no side-effects (e.g., it won’t mutate its input arguments).
The problem is that sometimes a reducer needs to make a complicated change to some input state, but you can’t just mutate the state argument without causing bugs.
The solution is a handy tool called Immer. In this video, I’ll introduce you to Immer and show you how to use it to reduce the complexity of your reducer code. With one or two small reducers, the difference is pretty subtle, but on a large project, it can significantly simplify your application code.
Here’s an example. Imagine you’re building a social network, and you need to keep track of posts that a user has liked. When they like a post, you add a like object to the user’s likes collection. That might look something like this:
Notice what we’re returning from the like.type case: Mixing bits of the payload into a nested property of the state object using the JavaScript object spread syntax: ...state and ...state.likes on lines 19–25.
After immer, you can simplify that part to a one-liner (line 21):
The produce function returns a partial application (a function which has been partially applied to its arguments) which then takes the arguments of the reducer function. You pass it a callback function which takes a draft of the state object instead of the real state object. You’re free to mutate that object as if it were any other mutable object in JavaScript. No more spreading nested properties to avoid mutating the input argument.
After your callback function runs, Immer compares the draft to the original state and then builds a new object with your changes applied, so your function feels like it’s mutating, but still behaves like a pure function. You get the best of both worlds: The simplicity of mutation with the benefits of immutability.
Next Steps
EricElliottJS.com has in-depth lessons on topics like pure functions, immutability, partial applications, and other functional and object oriented programming concepts.
Eric Elliott is a tech product and platform advisor, author of “Composing Software”, cofounder of EricElliottJS.com and DevAnywhere.io, and dev team mentor. He has contributed to software experiences for Adobe Systems, Zumba Fitness,The Wall Street Journal,ESPN,BBC, and top recording artists including Usher, Frank Ocean, Metallica, and many more.
He enjoys a remote lifestyle with the most beautiful woman in the world.
Fri May 15 2020 12:48:35 GMT+0700 (Western Indonesia Time)
As some of you might have guessed already, I have been a bit busy with the current beta of the new Delphi 10.4 Sidney. Usually one is not allowed to talk about the beta, but I have been given permission from Embarcadero to blog about some of the new features and improvements. Please note that everything said and shown here is from a pre-release version.
As David Millington already blogged about Redesigned Code Insight and Marco Cantú shared brought some newsabout Custom Managed Records, one of my personal favorites are the enhancements related to VCL styles.
In the past years quite a couple of my customers jumped on the VCL Style train as a simple and effective way to give their applications a fresh and modern look. Interestingly, most of them opted for an individual style tailored to match their corporate design.
One of these applications makes use of TMS Scripter to extend the standard functionality with customer designed forms. The Script Designer coming with Scripter is an extremely helpful tool in that.
Unfortunately the Script Designer doesn’t play well with the VCL style. That would be only a minor problem as the script design is not done very often and then mostly by the service staff. VCL styling is not critical for that. If we only could disable styling only for the designer form.
Now we can! Delphi 10.4 allows to set different styles per form and even per control.
That exactly solves the above problem. I can even imagine other use cases for having different styles even for controls on the same form. Some styles differ only marginally and this could be used to highlight several controls on a form more prominent than others.
This is a sample application with two forms. One form uses the native Windows style and the other uses the Windows10 Green VCL style. The VCL styled form contains two frames where one uses the Windows10 Blue style.
Another enhancement is the support for High DPI styles with the key feature of having different control entries for different sizes, backed up by bitmaps for different sizes. This is a sample project on a monitor with 100% scaling:
And here the same form dragged to a monitor with 175% scaling (open in new tab to see the actual size):
The button icons are taken from a TVirtualImagelist connected to a TImageCollection as it has already been available in Delphi 10.3 Rio. The two images to the left are shown with the new TVirtualImage control, that also takes its images from the same TImageCollection dynamically scaled to the size needed.
Note: This is part of the “Composing Software” series (now a book!) on learning functional programming and compositional software techniques in JavaScriptES6+ from the ground up. Stay tuned. There’s a lot more of this to come! Buy the Book | Index | < Previous | Next >
Abstract Data Types
Not to be confused with:
Algebraic Data Types (sometimes abbreviated ADT or AlgDT). Algebraic Data Types refer to complex types in programming languages (e.g., Rust, Haskell, F#) that display some properties of specific algebraic structures. e.g., sum types and product types.
Algebraic Structures. Algebraic structures are studied and applied from abstract algebra, which, like ADTs, are also commonly specified in terms of algebraic descriptions of axioms, but applicable far outside the world of computers and code. An algebraic structure can exist that is impossible to model in software completely. For contrast, Abstract Data Types serve as a specification and guide to formally verify working software.
An Abstract Data Type (ADT) is an abstract concept defined by axioms that represent some data and operations on that data. ADTs are not defined in terms of concrete instances and do not specify the concrete data types, structures, or algorithms used in implementations. Instead, ADTs define data types only in terms of their operations, and the axioms to which those operations must adhere.
Common ADT Examples
List
Stack
Queue
Set
Map
Stream
ADTs can represent any set of operations on any kind of data. In other words, the exhaustive list of all possible ADTs is infinite for the same reason that the exhaustive list of all possible English sentences is infinite. ADTs are the abstract concept of a set of operations over unspecified data, not a specific set of concrete data types. A common misconception is that the specific examples of ADTs taught in many university courses and data structure textbooks are what ADTs are. Many such texts label the data structures “ADTs” and then skip the ADT and describe the data structures in concrete terms instead, without ever exposing the student to an actual abstract representation of the data type. Oops!
ADTs can express many useful algebraic structures, including semigroups, monoids, functors, monads, etc. The Fantasyland Specification is a useful catalog of algebraic structures described by ADTs to encourage interoperable implementations in JavaScript. Library builders can verify their implementations using the supplied axioms.
Why ADTs?
Abstract Data Types are useful because they provide a way for us to formally define reusable modules in a way that is mathematically sound, precise, and unambiguous. This allows us to share a common language to refer to an extensive vocabulary of useful software building blocks: Ideas that are useful to learn and carry with us as we move between domains, frameworks, and even programming languages.
History of ADTs
In the 1960s and early 1970s, many programmers and computer science researchers were interested in the software crisis. As Edsger Dijkstra put it in his Turing award lecture:
“The major cause of the software crisis is that the machines have become several orders of magnitude more powerful! To put it quite bluntly: as long as there were no machines, programming was no problem at all; when we had a few weak computers, programming became a mild problem, and now we have gigantic computers, programming has become an equally gigantic problem.”
The problem he refers to is that software is very complicated. A printed version of the Apollo lunar module and guidance system for NASA is about the height of a filing cabinet. That’s a lot of code. Imagine trying to read and understand every line of that.
Modern software is orders of magnitude more complicated. Facebook was roughly 62 million lines of code in 2015. If you printed 50 lines per page, you’d fill 1.24 million pages. If you stacked those pages, you’d get about 1,800 pages per foot, or 688 feet. That’s taller than San Francisco’s Millenium Tower, the tallest residential building in San Francisco at the time of this writing.
Managing software complexity is one of the primary challenges faced by virtually every software developer. In the 1960s and 1970s, they didn’t have the languages, patterns, or tools that we take for granted today. Things like linters, intellisense, and even static analysis tools were not invented yet.
Many software engineers noted that the hardware they built things on top of mostly worked. But software, more often than not, was complex, tangled, and brittle. Software was commonly:
Over budget
Late
Buggy
Missing requirements
Difficult to maintain
If only you could think about software in modular pieces, you wouldn’t need to understand the whole system to understand how to make part of the system work. That principle of software design is known as locality. To get locality, you need modules that you can understand in isolation from the rest of the system. You should be able to describe a module unambiguously without over-specifying its implementation. That’s the problem that ADTs solve.
Stretching from the 1960s almost to the present day, advancing the state of software modularity was a core concern. It was with those problems in mind that people including Barbara Liskov (the same Liskov referenced in the Liskov Substitution Principle from the SOLID OO design principles), Alan Kay, Bertrand Meyer and other legends of computer science worked on describing and specifying various tools to enable modular software, including ADTs, object-oriented programming, and design by contract, respectively.
ADTs emerged from the work of Liskov and her students on the CLU programming language between 1974 and 1975. They contributed significantly to the state of the art of software module specification — the language we use to describe the interfaces that allow software modules to interact. Formally provable interface compliance brings us significantly closer to software modularity and interoperability.
Liskov was awarded the Turing award for her work on data abstraction, fault tolerance, and distributed computing in 2008. ADTs played a significant role in that accomplishment, and today, virtually every university computer science course includes ADTs in the curriculum.
The software crisis was never entirely solved, and many of the problems described above should be familiar to any professional developer, but learning how to use tools like objects, modules, and ADTs certainly helps.
Specifications for ADTs
Several criteria can be used to judge the fitness of an ADT specification. I call these criteria FAMED, but I only invented the mnemonic. The original criteria were published by Liskov and Zilles in their famous 1975 paper, “Specification Techniques for Data Abstractions.”
Formal. Specifications must be formal. The meaning of each element in the specification must be defined in enough detail that the target audience should have a reasonably good chance of constructing a compliant implementation from the specification. It must be possible to implement an algebraic proof in code for each axiom in the specification.
Applicable. ADTs should be widely applicable. An ADT should be generally reusable for many different concrete use-cases. An ADT which describes a particular implementation in a particular language in a particular part of the code is probably over-specifying things. Instead, ADTs are best suited to describe the behavior of common data structures, library components, modules, programming language features, etc. For example, an ADT describing stack operations, or an ADT describing the behavior of a promise.
Minimal. ADT specifications should be minimal. The specification should include the interesting and widely applicable parts of the behavior and nothing more. Each behavior should be described precisely and unambiguously, but in as little specific or concrete detail as possible. Most ADT specifications should be provable using a handful of axioms.
Extensible. ADTs should be extensible. A small change in a requirement should lead to only a small change in the specification.
Declarative. Declarative specifications describe what, not how. ADTs should be described in terms of what things are, and relationship mappings between inputs and outputs, not the steps to create data structures or the specific steps each operation must carry out.
A good ADT should include:
Human readable description. ADTs can be rather terse if they are not accompanied by some human readable description. The natural language description, combined with the algebraic definitions, can act as checks on each other to clear up any mistakes in the specification or ambiguity in the reader’s understanding of it.
Definitions. Clearly define any terms used in the specification to avoid any ambiguity.
Abstract signatures. Describe the expected inputs and outputs without linking them to concrete types or data structures.
Axioms. Algebraic definitions of the axiom invariants used to prove that an implementation has satisfied the requirements of the specification.
Stack ADT Example
A stack is a Last In, First Out (LIFO) pile of items which allows users to interact with the stack by pushing a new item to the top of the stack, or popping the most recently pushed item from the top of the stack.
Stacks are commonly used in parsing, sorting, and data collation algorithms.
Definitions
a: Any type
b: Any type
item: Any type
stack(): an empty stack
stack(a): a stack of a
[item, stack]: a pair of item and stack
Abstract Signatures
Construction
The stack operation takes any number of items and returns a stack of those items. Typically, the abstract signature for a constructor is defined in terms of itself. Please don’t confuse this with a recursive function.
stack(...items) => stack(...items)
Stack Operations (operations which return a stack)
push(item, stack()) => stack(item)
pop(stack) => [item, stack]
Axioms
The stack axioms deal primarily with stack and item identity, the sequence of the stack items, and the behavior of pop when the stack is empty.
Identity
Pushing and popping have no side-effects. If you push to a stack and immediately pop from the same stack, the stack should be in the state it was before you pushed.
pop(push(a, stack())) = [a, stack()]
Given: push a to the stack and immediately pop from the stack
Should: return a pair of a and stack().
Sequence
Popping from the stack should respect the sequence: Last In, First Out (LIFO).
pop(push(b, push(a, stack())) = [b, stack(a)]
Given: push a to the stack, then push b to the stack, then pop from the stack
Should: return a pair of b and stack(a).
Empty
Popping from an empty stack results in an undefined item value. In concrete terms, this could be defined with a Maybe(item), Nothing, or Either. In JavaScript, it’s customary to use undefined. Popping from an empty stack should not change the stack.
pop(stack()) = [undefined, stack()]
Given: pop from an empty stack
Should: return a pair of undefined and stack().
Concrete Implementations
An abstract data type could have many concrete implementations, in different languages, libraries, frameworks, etc. Here is one implementation of the above stack ADT, using an encapsulated object, and pure functions over that object:
// remove the last item from the list and // assign it to a variable const [item] = newItems.splice(-1);
// return the pair return [item, stack(...newItems)]; }, // So we can compare stacks in our assert function toString: () => `stack(${ items.join(',') })` });
// A simple assert function which will display the results // of the axiom tests, or throw a descriptive error if an // implementation fails to satisfy an axiom. const assert = ({given, should, actual, expected}) => { const stringify = value => Array.isArray(value) ? `[${ value.map(stringify).join(',') }]` : `${ value }`;
if (actualString === expectedString) { console.log(`OK: given: ${ given } should: ${ should } actual: ${ actualString } expected: ${ expectedString } `); } else { throw new Error(`NOT OK: given ${ given } should ${ should } actual: ${ actualString } expected: ${ expectedString } `); } };
// Concrete values to pass to the functions: const a = 'a'; const b = 'b';
// Proofs assert({ given: 'push `a` to the stack and immediately pop from the stack', should: 'return a pair of `a` and `stack()`', actual: pop(push(a, stack())), expected: [a, stack()] })
assert({ given: 'push `a` to the stack, then push `b` to the stack, then pop from the stack', should: 'return a pair of `b` and `stack(a)`.', actual: pop(push(b, push(a, stack()))), expected: [b, stack(a)] });
assert({ given: 'pop from an empty stack', should: 'return a pair of undefined, stack()', actual: pop(stack()), expected: [undefined, stack()] });
Conclusion
An Abstract Data Type (ADT) is an abstract concept defined by axioms which represent some data and operations on that data.
Abstract Data Types are focused on what, not how (they’re framed declaratively, and do not specify algorithms or data structures).
Common examples include lists, stacks, sets, etc.
ADTs provide a way for us to formally define reusable modules in a way that is mathematically sound, precise, and unambiguous.
ADTs emerged from the work of Liskov and students on the CLU programming language in the 1970s.
ADTs should be FAMED. Formal, widely Applicable, Minimal, Extensible, and Declarative.
ADTs should include a human readable description, definitions, abstract signatures, and formally verifiable axioms.
Bonus tip: If you’re not sure whether or not you should encapsulate a function, ask yourself if you would include it in an ADT for your component. Remember, ADTs should be minimal, so if it’s non-essential, lacks cohesion with the other operations, or its specification is likely to change, encapsulate it.
Glossary
Axioms are mathematically sound statements which must hold true.
Mathematically sound means that each term is well defined mathematically so that it’s possible to write unambiguous and provable statements of fact based on them.
Next Steps
EricElliottJS.com features many hours of video lessons and interactive exercises on topics like this. If you like this content, please consider joining.
Eric Elliott is a tech product and platform advisor, author of “Composing Software”, cofounder of EricElliottJS.com and DevAnywhere.io, and dev team mentor. He has contributed to software experiences for Adobe Systems, Zumba Fitness,The Wall Street Journal,ESPN,BBC, and top recording artists including Usher, Frank Ocean, Metallica, and many more.
He enjoys a remote lifestyle with the most beautiful woman in the world.
Tue May 05 2020 16:16:32 GMT+0700 (Western Indonesia Time)
Async iterators have been around in Node since version 10.0.0, and they seem to be gaining more and more traction in the community lately. In this article, we’ll discuss what Async iterators do and we'll also tackle the question of what they could be used for.
What are Async Iterators
So what are async iterators? They are practically the async versions of the previously available iterators. Async iterators can be used when we don't know the values and the end state we iterate over. Instead, we get promises that eventually resolve to the usual { value: any, done: boolean } object. We also get the for-await-of loop to help us with looping over async iterators. That is just like the for-of loop is for synchronous iterators.
const asyncIterable = [1, 2, 3];
asyncIterable[Symbol.asyncIterator] = async function*() {
for (let i = 0; i < asyncIterable.length; i++) {
yield { value: asyncIterable[i], done: false }
}
yield { done: true };
};
(async function() {
for await (const part of asyncIterable) {
console.log(part);
}
})();
The for-await-of loop will wait for every promise it receives to resolve before moving on to the next one, as opposed to a regular for-of loop.
Outside of streams, there are not a lot of constructs that support async iteration currently, but the symbol can be added to any iterable manually, as seen here.
Streams as async iterators
Async iterators are very useful when dealing with streams. Readable, writable, duplex, and transform streams all have the asyncIterator symbol out of the box.
async function printFileToConsole(path) {
try {
const readStream = fs.createReadStream(path, { encoding: 'utf-8' });
for await (const chunk of readStream) {
console.log(chunk);
}
console.log('EOF');
} catch(error) {
console.log(error);
}
}
If you write your code this way, you don't have to listen to the 'data' and 'end' events as you get every chunk by iterating, and the for-await-of loop ends with the stream itself.
Consuming paginated APIs
You can also fetch data from sources that use pagination quite easily using async iteration. To do this, we will also need a way to reconstruct the body of the response from the stream the Node https request method is giving us. We can use an async iterator here as well, as https requests and responses are streams in Node:
const https = require('https');
function homebrewFetch(url) {
return new Promise(async (resolve, reject) => {
const req = https.get(url, async function(res) {
if (res.statusCode >= 400) {
return reject(new Error(`HTTP Status: ${res.statusCode}`));
}
try {
let body = '';
/*
Instead of res.on to listen for data on the stream,
we can use for-await-of, and append the data chunk
to the rest of the response body
*/
for await (const chunk of res) {
body += chunk;
}
// Handle the case where the response don't have a body
if (!body) resolve({});
// We need to parse the body to get the json, as it is a string
const result = JSON.parse(body);
resolve(result);
} catch(error) {
reject(error)
}
});
await req;
req.end();
});
}
We are going to make our requests to the Cat API to fetch some cat pictures in batches of 10. We will also include a 7-second delay between the requests and a maximum page number of 5 to avoid overloading the cat API as that would be CATtastrophic.
function fetchCatPics({ limit, page, done }) {
return homebrewFetch(`https://api.thecatapi.com/v1/images/search?limit=${limit}&page=${page}&order=DESC`)
.then(body => ({ value: body, done }));
}
function catPics({ limit }) {
return {
[Symbol.asyncIterator]: async function*() {
let currentPage = 0;
// Stop after 5 pages
while(currentPage < 5) {
try {
const cats = await fetchCatPics({ currentPage, limit, done: false });
console.log(`Fetched ${limit} cats`);
yield cats;
currentPage ++;
} catch(error) {
console.log('There has been an error fetching all the cats!');
console.log(error);
}
}
}
};
}
(async function() {
try {
for await (let catPicPage of catPics({ limit: 10 })) {
console.log(catPicPage);
// Wait for 7 seconds between requests
await new Promise(resolve => setTimeout(resolve, 7000));
}
} catch(error) {
console.log(error);
}
})()
This way, we automatically get back a pageful of cats every 7 seconds to enjoy.
A more common approach to navigation between pages might be to implement a next and a previous method and expose these as controls:
As you can see, async iterators can be quite useful when you have pages of data to fetch or something like infinite scrolling on the UI of your application.
These features have been available in browsers for some time as well, in Chrome since version 63, in Firefox since version 57 and in Safari since version 11.1. They are, however, currently unavailable in IE and Edge.
Did you get any new ideas on what you could use async iterators for? Do you already use them in your application?
Software development is an incredibly rewarding skill that can be extremely valuable. It’s remote-work friendly, and no matter where you live in the world, if you get good enough, you can qualify for great paying work ranging from $100k/year — $200k+/year (USD). Some of the highest-paid JavaScript developers make close to $500k/year. But to qualify for those great salaries, you have to get undeniably good at what you do.
Even if you’re already a professional software developer, you need to learn how to learn to code. Choosing a career in software development is choosing a path of lifelong learning.
In my role as a mentor I’ve had a peek into the learning process of hundreds of developers. What shocked me most is how much faster some learn than others. Some with little or no coding background learn new concepts more than 10 times faster than others who may have 10+ year’s experience in the craft. The secret is, you can, too.
There are a handful of learning secrets that can put you on a rocket to mastery of the craft.
1. Code
The best way to learn to code is to code. Jump into a developmentenvironment, and write some code. If you’re reading a book or blog post and you encounter a code example, type it out in a codeeditor and try to make it work. Once you get it working, play with it. Change things up. Try to think of other ways to apply it, or other things you can do with the same technique. Playwiththecode.
Book smarts will only get you so far. The best learning will come from doing.
2. Drive
The best way to get great at something is to do it. A lot. You need to be motivated and determined to learn. One way to get motivated is to give yourself the time and patience to gain some mastery. You don’t need to be an expert right away. It’s like learning a musical instrument. You can’t sit down at a piano and immediately be the next Debussy, but you can master the C major scale in your first sitting.
Likewise, you’re not going to sit down and immediately crank out the next Instagram, TikTok or Fortnite.
As you begin to master each small lesson, you’ll realize you can do this. You can get good at this. You can start to see your goal begin to materialize, and you’ll be more motivated to drive toward that goal.
Keep at it.
3. Focus
I’ve seen a lot of developers try to master everything all at once and get nowhere, fast. Their progress slows to an excruciatingly glacial crawl rather than a gold medal sprint.
If you want to learn something quickly, you can’t have your attention scattered everywhere except where you need it. Pick one language (start with JavaScript), one framework (start with React), one book, one course, one topic, etc. Whatever you pick, focus on that one thing until you have a sufficient mastery of it before you move on to something else.
I tell people all the time, concentrate on one language full time for at least a year before you branch out and learn another language. Decades ago, it used to be that a typical software developer would actually need to learn many languages in the course of their career to stay competitive in the field.
While it’s still true that learning more than one language can teach you different ways of seeing things, and even deepen your understanding of your primary language, these days a single language (JavaScript) can get you through the majority of your career.
Tip from a hiring manager: The skills you specialize in are your most valuable skills. If you commit to being a lifelong generalist bouncing from language to language, you’ll put an artificial ceiling on your mastery and earning potential.
4. Read
Many of the most useful insights available to software developers come from books. There are lots of good YouTube videos and courses online, but books are the standard bearers of software development culture and knowledge. In particular, I’ve found the following books extremely valuable:
If you want to move a new concept from a familiar-sounding idea into long-term memory, reviewing a topic is your friend. The mistake most learners make is that they quickly read a book or a blog post, and then promptly forget what they read the next day. If you read something interesting that you want to remember, review it the next day. Test yourself. Then test yourself again the day after. And the day after. Do that 4 days in a row, and your chances of committing the learning to long-term memory increase dramatically.
6. Mix Mediums
Some people learn best by reading, others by watching videos, but if you mix it up — watch a video, then do some reading, then practice with some interactive code sessions, you’ll repeat the concepts from multiple angles, and multiple examples. You’ll naturally drill some review, and get some practice in while you’re at it.
7. Build Projects
Learning the concept doesn’t mean you’ll know how to use it in a real app. Once you’ve been coding with exercises for a few weeks, it’ll be time to build something of your own. Need an idea? Instead of the ubiquitous todo app, try implementing The Rejection App.
8. Value Principles Over Frameworks and Languages
Frameworks and APIs change fast. Software design principles are evergreen. Learn principles that translate across language barriers.
Do One Thing (DOT) — Simplified from Doug McIlroy’s “Do One Thing and Do It Well (DOTADIW)” — a function should have one job. It should not fetch data AND process data AND draw to the screen. It should only fetch data. Or only process data. Or only draw to the screen. (Time to split your React components into smaller parts!)
“Program to an interface, not an implementation.” — Gang of Four, “Design Patterns”
“Favor object composition over class inheritance.” — Gang of Four, “Design Patterns”
Avoid shared mutable state.
“Premature optimization is the root of all evil.” ~ Donald Knuth
“You Aren’t Gonna Need It (YAGNI)” — Don’t write code for something that isn’t actually required, yet.
9. Share, Document, and Mentor
“Dr. Hoenikker used to say that any scientist who couldn’t explain to an eight-year-old what he was doing was a charlatan.” ~ Kurt Vonnegut — Cat’s Cradle
Learning how to code is just part of the equation. When you’re collaborating with other developers, your code will be reviewed by other people, and they will sometimes challenge your choices. As you try to explain yourself, you may find that you didn’t understand well enough to defend your position. Practice explaining, documenting, and teaching the concepts to your coworkers and other collaborators on your projects.
10. Practice, practice, practice!
Anybody who’s ever learned an acquired skill can attest, practice is key. But to get better you can’t just practice the concepts you already know. You need to challenge yourself and extend beyond the realm of what is familiar. If you constantly practice at the edge of your current abilities, you will excel.
The book, “Peak: The New Science of Expertise” delves into the study of deliberate practice and offers a wealth of insights that you can apply in your daily life to get better at practice. I strongly recommend reading it so that you can make your practice time and side-projects more productive.
Eric Elliott is a tech product and platform advisor, author of “Composing Software”, cofounder of EricElliottJS.com and DevAnywhere.io, and dev team mentor. He has contributed to software experiences for Adobe Systems, Zumba Fitness,The Wall Street Journal,ESPN,BBC, and top recording artists including Usher, Frank Ocean, Metallica, and many more.
He enjoys a remote lifestyle with the most beautiful woman in the world.
How to Learn to Code was originally published in JavaScript Scene on Medium, where people are continuing the conversation by highlighting and responding to this story.
Fri Apr 24 2020 07:34:10 GMT+0700 (Western Indonesia Time)
It’s Test-Driven Development with a twist! Developing new functionality with approval tests requires some slightly different steps, but if you’re a visual thinker like me you might just prefer it. In this blog post I’ll explain how it works.
You may be familiar with the Gilded Rose Kata. It’s the most popular exercise I have on my GitHub page. About a year ago I posted some videos demonstrating a way to solve it. I used several techniques, including ‘Approval’ testing, which is also known as ‘Golden Master’ testing. It’s an approach that’s often used to get legacy code under control. What’s perhaps less known is that you can use the same tools for new development. I’ve put together a new exercise – the ‘Lift’ kata – to help people understand how this works.
If you’ve never done the Lift Kata now might be a good time to try it out. I originally worked from this description of it, and I now have my own description and GitHub repo for those who want to try it out “approval testing style”. The first step towards solving it is to spend some time understanding the problem. I’m going to assume that most of you have been in a lift at some point, so take a few minutes to note down your understanding of how they work, and the rules that govern them. Perhaps even formulate some test cases.
I did this by sketching out some scenarios. I say ‘sketch’ and not ‘formulate’ quite deliberately! The way my mind works is quite visual, so for me it made sense to represent each floor vertically on the page, and write the name of the lift next to the floor it was on. This shows a lift system with four floors named 0, 1, 2, 3, and one lift named ‘A’, on floor 0:
This is just a snapshot of a moment in time. I then started to think about how a lift responds to people pressing the floor buttons inside. I figured that this is an important aspect to test and proceeded to sketch it out. It occurred to me that I could write a list of requested floor numbers next to the lift name, but then I noticed it was even clearer if I put a mark next to each requested. For example, if passengers request floors 2 and 3 I can sketch it like this:
The next move for this lift would be to go to floor 2 since it’s the closest requested floor. That example could be formulated as a test case sketch like this:
I can use this sketch as the first test case for TDD. I’ll need to write code for a lift with floors and requests. I’ll also need to write a ‘Printer’ that can turn a lift object into some output that looks like my sketch. I write some code for this and use the printer output in the ‘verify’ step of the test. After some work the output looks like this:
This ascii-art looks much the same as my sketch. One difference is that I wrote the floor numbers at both ends of each line. This is a trick to stop my editor from deleting what it thinks is irrelevant trailing whitespace at the ends of lines! I think it looks enough like my sketch to approve the output and store it as a ‘golden master’ for this scenario. Actually, I’ve already approved it several times as it started to look more and more like my sketch. And every time I did that I could refactor a little before adding more functionality and updating the approved file again.
I’m looking at the requirements again and realize that I haven’t modelled the lift’s doors. You can’t fulfill a request until you’ve opened the doors, and that only happens after you’ve moved to the right floor. I drew a new sketch including them, shown below. I’ve written [A] for a lift called ‘A’ with closed doors, and ]A[ for when it has open doors. I also show an intermediate step when the lift is on the correct floor, but since the doors are closed the request is still active:
To get this to pass I’ll need to update all of my lift class, my printer, and my test case. After a little coding, and a few iterations of improving both the code and the printer, the test produces output that looks like this and I approve it:
Now that the test is passing, I’m fairly happy that my lift can answer requests. The next feature I was thinking about was being able to call the lift from another floor. For this I think I’ll need a new test case. Let’s say I’m standing on the third floor and the lift is on floor 1, and I press the button to go down. I can include that in my sketch by putting a ”v” next to the floor I’m on. The whole scenario might play out like this:
As before, I spend time improving both the lift code and the printer. I approve intermediate results several times and do several refactorings. At some point the output from my program looks like my sketch and I approve it:
Great stuff! My lift can now fulfill requests from passengers and answer calls from another floor. Time for a celebratory cup of tea!
I’ve shown you the first couple of test cases, but there are of course plenty more features I could implement. A system with more than one lift for a start. Plus, the lift should alert the person waiting when it arrives by making a ‘ding’ when it opens the doors. I feel my lifts would be vastly improved if they said ding! I’ll have to come up with a new sketch that includes this feature. For the moment, let’s pause and reflect on the development process I’ve used so far.
Comparing Approval Testing with ordinary TDD
If I’d been doing ordinary Test-Driven Development with unit tests I might have created a dozen tests in the same time period for the same functionality. With Approval Testing I’ve still been working incrementally and iteratively and refactoring just as frequently. I only have two test cases though. The size of the unit being tested is a little larger than with ordinary TDD, but the feedback cycle is similarly short.
Having a slightly larger unit for testing can be an advantage or a disadvantage, depending on how you view it. When the chunk of code being tested is larger, and the test uses a fairly narrow interface to access that code, it constrains the design less than it would if you instead had many finer grained tests for lower level interfaces. That means the tests don’t influence the design as strongly, and don’t need to be changed as often when you refactor.
Another difference is that I’ve invested some effort in building code that can print a lift system as an ASCII artwork, which is reused in all my tests. In classic TDD I’d have had to write assertion code that would have been different in every test.
Try it for yourself
What I’ve done isn’t exactly the same as ordinary TDD, but I think it’s a useful approach with many of the same benefits. I’ve put this exercise up on GitHub, so you can try it out for yourself. I’ve included the code for my printer so you don’t have to spend a lot of time setting that up, and can get on with developing your lift functionality. I’ve also recorded a video together with Adrian Bolboaca where I explain how the exercise works. So far I’ve translated the starting code into Java, C# and Python, and some friends have done a C++ version. (Do send me a pull request if you translate it to your favourite language.) And that’s it! You’ve seen how easy it is, so why don’t you have a try at Approval testing-style TDD for yourself?
Mon Apr 20 2020 15:34:02 GMT+0700 (Western Indonesia Time)
Although I use React Hooks a lot, I don't really like them. They are solving tough problems, but with an alien API that is hard to manage at scale.
It's even harder to wire them together with a library that is based on mutable data. The two concepts don't play well together, and forcing them would cause a hot mess. Instead, the React Easy State team at RisingStack is working on alternative patterns that combine the core values of React Hooks and mutable data.
We think these core values are:
encapsulation of pure logic,
reusability,
and composability.
At the same time, we are trying to get rid of:
the strange API,
reliance on closures to store data,
and overused patterns.
This article guides you through these points and how React Easy State tackles them compared to vanilla Hooks.
TLDR: "React Easy State is a transparent reactivity based state manager for React. In practical terms: it automagically decides when to render which components without explicit orders from you."
A basic example of Hooks & React Easy State
Let's see how to set the document title with Hooks and with React Easy State.
autoEffect replaces the useEffect hook while store replaces useState, useCallback, useMemo and others. Under the hood, they are built on top of React hooks, but they utilize a significantly different API and mindset.
Reusability
What if you have to set the document’s title again for other pages? Having to repeat the same code every time would be disappointing. Luckily, Hooks were designed to capture reusable logic.
React Easy State tackles the same problem with store factories: a store factory is a function that returns a store. There are no other rules. You can use store and autoEffect - among other things - inside it.
titleStore.js:
import { store, autoEffect } from "@risingstack/react-easy-state";
export default function titleStore(initalTitle) {
const title = store({
value: initalTitle,
onChange: ev => (title.value = ev.target.value)
});
autoEffect(() => (document.title = title.value));
return title;
}
App.js:
import React from "react";
import { view } from "@risingstack/react-easy-state";
import titleStore from "./titleStore";
export default view(() => {
const title = titleStore("App title");
return <input value={title.value} onChange={title.onChange} />;
});
Things can get messy as complexity grows, especially when async code gets involved. Let's write some reusable data fetching logic! Maybe we will need it later (;
Notice how we have to use a setState with an updater function in the finally block of useFetch. Do you know why does it need special handling?
If not, try to rewrite it to setState({ ...state, loading: false }) in the CodeSandbox demo and see what happens. Then read this article to gain a deeper understanding of hooks and stale closures. Seriously, do these before you go on!
Otherwise, try to think of a good reason why the other setStates should be rewritten to use updater functions. (Keep reading for the answer.)
React Easy State version
You have probably heard that mutable data is bad (like a 1000 times) over your career. Well... closures are worse. They seem simple at a glance but they hide your data in function creation time specific “pockets” that introduce a new layer of complexity. Instead of using the latest data during a function execution you have to remember what data it “pocketed” when it was created.
Hooks are heavily relying on closures to store data, which leads to issues like the example above. Obviously, this is not a bug in the hooks API, but it is a serious cognitive overhead that gets mind-bending as your complexity grows.
React Easy State is storing its data in mutable objects instead, which has its own quirks, but it is way easier to handle in practice. You will always get what you ask for, and not some stale data from a long-gone render.
While we played with fetching data, the document title setting application turned into a massive hit with tons of feature requests. Eventually, you end up fetching related pokemon from the free pokeAPI.
Luckily you already have a data fetching hook, what a coincidence...
You don't want to refactor your existing code snippets, and it would be nicer to compose them together into more complex units. The hooks API was designed to handle this.
The fetch callback uses state and has it inside its dependency array. This means that whenever state changes fetch gets recreated, and whenever fetch gets recreated our useEffect in usePokemon kicks in ...
useEffect(() => {
fetch(name);
}, [fetch, name]);
That's bad news! We only want to refetch the pokemon when name changes. It's time to remove fetch from the dependency array.
And it breaks again... This time, it is not looping, but it always fetches the first (stale) pokemon. We keep using an old fetch that is stuck with a stale closure as its data source.
The correct solution is to modify our useFetch hook to use the setState function inside the fetch callback and remove the state dependency from its dependency array.
This mess is caused by the combination of closures and hook dependency arrays. Let's avoid both of them.
React Easy State version
React Easy State takes a different approach to composability. Stores are simple objects which can be combined by nesting them in other objects.
pokeStore.js:
import { store, autoEffect } from "@risingstack/react-easy-state";
import titleStore from "./titleStore";
import fetchStore from "./fetchStore";
const POKE_API = "https://pokeapi.co/api/v2/pokemon/";
export default function pokeStore(initialName) {
const pokemon = store({
name: titleStore(initialName),
data: fetchStore(POKE_API)
});
autoEffect(() => pokemon.data.fetch(pokemon.name.value));
return pokemon;
}
The data is stored in - always fresh - mutable objects and hook-like dependency arrays are not required because of the underlying transparent reactivity. Our original fetchStore works without any modification.
Extra Features that Hooks don't have
React Easy State is a state management library, not a hook alternative. It provides some features that Hooks can not.
Global state
You can turn any local state into a global one by moving it outside of component scope. Global state can be shared between components regardless of their relative position to each other.
pokemon.js:
import pokeStore from "./pokeStore";
// this global state can be used by any component
export default pokeStore("ditto");
Input.js:
import React from "react";
import { view } from "@risingstack/react-easy-state";
import pokemon from "./pokemon";
export default view(() => (
<input value={pokemon.name.value} onChange={pokemon.name.onChange} />
));
As you can see, old-school prop propagation and dependency injection is replaced by simply importing and using the store.
How does this affect testability, though?
Testing
Hooks encapsulate pure logic, but they can not be tested as such. You must wrap them into components and simulate user interactions to access their logic. Ideally, this is fine since you want to test everything - logic and components alike. Practically, time constraints of real-life projects won’t allow that. I usually test my logic and leave my components alone.
React Easy State store factories return simple objects, which can be tested as such.
While hooks are new primitives for function components only, store factories work regardless of where they are consumed. This is how you can use our pokeStore in a class component.
Using store factories in classes still has a few rough edges regarding autoEffect cleanup, we will address these in the coming releases.
Reality check
This article defied a lot of trending patterns, like:
hooks,
avoiding mutable data,
traditional dependency injection,
and full front-end testing.
While I think all of the above patterns need a revisit, the provided alternatives are not guaranteed to be 'better'. React Easy State has its own rough edges, and we are working hard to soften them in the coming releases.
As a starter, keep tuned for our 'Idiomatic React Easy State' docs in the near future. Consider this article as a fun and thought-provoking experiment in the meantime.
The important thing is to not stop questioning. Curiosity has its own reason for existing.
Mon Apr 13 2020 03:07:27 GMT+0700 (Western Indonesia Time)
JavaScript Quick Tip — Avoid Serial Request Waterfalls
One gotcha that comes up frequently and has a serious impact on application performance is the tendency to accidentally fetch data in serial that could have been fetched in parallel. Don’t just drop an await in everywhere you use promises. Instead, think about the fetching dependencies. If you’re fetching more than one thing, make sure you fetch in parallel whenever you can. This will make a huge difference in your application’s performance.
Here’s some example code for you to play with.
Eric Elliott is a tech product and platform advisor, author of “Composing Software”, cofounder of EricElliottJS.com and DevAnywhere.io, and dev team mentor. He has contributed to software experiences for Adobe Systems, Zumba Fitness,The Wall Street Journal,ESPN,BBC, and top recording artists including Usher, Frank Ocean, Metallica, and many more.
He enjoys a remote lifestyle with the most beautiful woman in the world.
Fri Apr 10 2020 06:47:03 GMT+0700 (Western Indonesia Time)
An introduction to the Mu’allaqat or the Hanging odes. These are 7 poems that represent the finest of pre-Islamic Arabic poetry. The study of pre-Islamic poetry offers much insight into the language and the depth of its meanings and usages.
Wed Apr 01 2020 07:06:04 GMT+0700 (Western Indonesia Time)
Passwords are Obsolete — How to Secure Your App and Protect Your Users
I’ve said this part before, so if you read the previous article, skip to “How to Implement Passwordless Authentication”, below. I’m posting the introduction again for those of us who are too lazy to click a link.
Managing user authentication and authorization is a very serious responsibility, and getting it wrong can cost a lot more than unauthorized access to your app. It can also compromise user privacy or lead to financial damage or identity theft for your users. Unless you are a huge company with a huge security team, you don’t want that kind of responsibility or liability for your app.
Most apps today are built with username and password authentication, and once a user is signed in, that user session can do anything it wants to do, without revalidating the user’s intention.
That security model is broken for a number of reasons:
Passwords are obsolete. If you have any doubt about that, head over to HaveIBeenPwned and plunk in your email address. Sensitive data has been stolen in many high profile data breaches impacting companies like Dropbox, Adobe, Disqus, Kickstarter, LinkedIn, Tumblr, and many, many more. If there’s a database with passwords in it, it’s only a matter of time before it gets stolen.
If an attacker can discover a password that hashes to the same hash as the one stored in your database, they’ll take that combination and try it on things like bank account websites. In many cases, even a salted, hashed password database will leak another valid username/password pair every minute or so. That’s about half a million leaked passwords per year — and that rate is doubling every few years. I wrote about this topic in 2013. The bad guys are now hashing passwords more than 10 times faster than they were then.
User Sessions Get Hijacked.User sessions are commonly hijacked after authentication, allowing attackers to exploit that user’s application resources. To prevent that, you’d need to re-authenticate the user with every request, and in the land of usernames and passwords, that would create an awkward user experience.
Upgrading Authentication
One of the coolest features of decentralized applications is the decentralized security model. Using the Ethereum blockchain ecosystem, each user gets a public and private key pair. You can sign every request with the user’s private key and verify requests with the user’s public key. Each request is uniquely authenticated, which reduces the chance of hijacking to nearly zero.
A hijacker would need the ability to sign on behalf of the user, but they can’t do that without access to the user’s private key, which is protected by hardware-level security. Using Hardware Security Modules (HSMs), we can protect private keys from exposure to the internet. Instead of sending the private key over the network, we send the messages which need signing to the private key in the HSM. The user authorizes the signature, and the signed request gets authenticated and processed. If the signature is invalid, the request gets rejected.
Additionally, those key pairs can encrypt and decrypt user data so that only the user who owns the data can read it. If an app developer chooses to let users encrypt their data, even the application can’t decrypt the data without the user’s permission. With this security model, we can put users in control of their private information.
Passwordless Authentication with Magic Links
An emerging way to bypass the need for passwords is to use magic links. A magic link is a temporary URL that expires after use, or after a specific interval of time. Magic links can be sent to your email address, an app, or a security device. Clicking the link authorizes you to sign in.
Password-only security is obsolete and dangerously insecure. Magic links eliminate the headaches of lost or stolen passwords and protect app users.
But you don’t want to try to roll your own public/private key-based magic links, or you’ll move from the frying pan into the fire. If you think keeping passwords safe is hard, don’t even think of trying to manage private keys, which, if stolen, could potentially grant access to an Ethereum wallet loaded with valuable money, collectibles, memberships, etc.
Lots of apps and wallets push that responsibility on end users. That’s like putting the key to a bank vault in somebody’s mobile phone. What if the phone gets lost, stolen, or upgraded?
In my opinion, the best way forward is to delegate key management to people who specialize in key management. One such service has launched today. It’s called Magic. It’s made by Magic Labs, a cybersecurity company who have assembled experts from companies like Docker, Apple, Google, Amazon, Yelp, Uber, Accenture, and TD Bank.
Their security model stores your user’s private keys in HSMs. An HSM is a bit like a hardware locker for private keys. The keys are protected by hardware and never leave the hardware. Keys are never exposed to the internet. Instead, messages that need to be signed by those keys are delivered to and signed on the dedicated hardware.
Imagine a bank safety deposit box. What’s inside the box is a key that can be used to authorize signatures and transactions. When you rent a safety deposit box from a bank, the contents of the box belong to you. The bank just keeps it safe for you. Using Magic is a bit like giving each of your users a dedicated safety deposit box for their key. Magic can’t access the keys, and neither can you. Keys are always in the user’s control but hosted in the cloud, so users don’t have to worry about losing them.
In other words, Magic is a non-custodial, hardware-secured key management system. It features best-in-class security and SOC 2 compliance. But the best part is that your users don’t need to know what any of that means. All they need to know how to do is enter their email and click a button.
Adding Magic to Your App
Magic has a great getting started guide and documentation to help you get set up fast and understand the basics, but we’re going to take a deeper dive and dissect the actual useMagicLink React hook that we developed for our integration with EricElliottJS.com. If you read the previous article on Fortmatic, this is going to look very similar to the useFortmatic hook we developed before, but it has a few slight changes.
Before you dive into the source code, you’ll need to understand some foundational concepts:
This file requires a few helpers. The first is a usePromise hook that holds onto a persistent reference to the magicReady promise. I promise, you want your magic to be ready before you try to use it, or your spell will backfire.
And the localStorage drop-in replacement for useState:
Last, some miscellaneous tools:
With the hook finished, our next step was to integrate the hook with our existing app. We use Redux and try to isolate logic, I/O, and state process as much as we can from our presentation components. This Higher Order Component (HOC) lets us compose our magic link logic into every page in our app in one place.
Here’s the HOC we use to compose cross-cutting concerns into every page that needs them:
Since these HOCs are so easy to create and maintain, you can create custom HOCs that omit features that aren’t needed for a particular page or add features that aren’t needed for every page. Now we can sign in or out anywhere on our site!
Conclusion
Here are my current recommendations for user authentication security:
Password-only security is obsolete and dangerously insecure. Don’t use it.
Public key cryptography gives us public/private key pairs we can use to enhance user safety significantly.
Key management is hard, both for app developers and end users.
App developers should delegate key management to security specialists.
Hardware Security Modules (HSMs) can securely store user keys in the cloud, without forcing users to know what any of this means.
Magic links eliminate the headaches of lost or stolen passwords and protect app users.
Magic provides best-in-class, non-custodial, delegated key management for your users. They’re paving the way for a more secure future for apps and users. They have set a new bar for user authentication security and user experience, and they’re currently the only authentication solution I recommend for developers of new applications.
Magic unlocks Ethereum. With Magic’s Ethereum-based public/private key pairs, we can use them to transact with Ethereum and EVM-compatible protocols and tokens, unlocking lots of capabilities that were never possible before blockchain technology was invented.
Note: You don’t have to build an Ethereum dapp to benefit from Magic’s passwordless authentication and improved user security. You can improve any app with Magic.
Take a test drive of the authentication flow on EricElliottJS.com. Our existing users have GitHub authenticated accounts that need to be linked the first time you sign in, but once you’ve linked your GitHub account once, you won’t need to do it again. Sign out and sign back in to see the Magic-only flow.
The GitHub flow requires shields to be down in Brave because of how the authentication flow is delegated. The new Magic authentication flow works like a charm with shields up. Magic’s simplified flow has lots of hidden benefits.
While you’re checking out EricElliottJS.com, browse the premium content, and explore some of our online JavaScript lessons.
Make some magic.
Eric Elliott is a tech product and platform advisor, author of “Composing Software”, cofounder of EricElliottJS.com and DevAnywhere.io, and dev team mentor. He has contributed to software experiences for Adobe Systems, Zumba Fitness,The Wall Street Journal,ESPN,BBC, and top recording artists including Usher, Frank Ocean, Metallica, and many more.
He enjoys a remote lifestyle with the most beautiful woman in the world.
Tue Mar 31 2020 15:01:04 GMT+0700 (Western Indonesia Time)
Hi! About a year ago I created React Easy State - a moderately popular React state manager - which currently has around 1.8K stars, and a small but enthusiastic community forming around it. Unfortunately, I didn't have enough time to keep up with the blooming community in the last couple of months.
I’m happy to announce, that this situation ends today!
React Easy State just got moved under RisingStack and receives company support from now on. The new, enthusiastic support team without licensing changes makes me really excited about the future!
Special shoutout to my colleauges, Roland Szoke, Peter Czibik and Daniel Gergely who already contributed immensely to this project in the past weeks! <3
So what is React Easy State?
React Easy State is a transparent reactivity based state manager for React. In practical terms: it automagically decides when to render which components without explicit orders from you.
import React from 'react';
import { store, view } from 'react-easy-state';
const counter = store({
num: 0,
increment: () => counter.num++
});
// this component re-render's when counter.num changes
export default view(() => (
<button onClick={counter.increment}>{counter.num}</button>
));
Why should I use it?
Transparent reactivity is not a new idea, Vue and React's Mobx are popular libraries that implement it. So how does Easy State differ from these?
The technical edge
Historically, transparent reactivity libraries could only work with basic get and set operations. Slightly more complex use cases - like arrays or delete operations - required special handling, which killed the 'transparent vibe'. Then came Proxies, a meta-programming addition to JavaScript.
Proxies can intercept language operations which were not previously possible. They gave a huge boost to transparent reactivity libraries and both MobX and Vue embraced them since.
Instead of embracing them, Easy State's core was born out of Proxies 4 years ago, back when they were an experimental API in Chrome only. It is not carrying any bloat from the pre-proxy era and it had a long time to mature during those 4 years. This advantage is noticeable both in the minimalistic API and the stability of the library.
The everyday API consists of two functions only. The rest is automagic and contextual clues to let you focus on business logic instead of reading docs.
Handling global state in React was always a bit clumsy. With Easy State you can create both global and local state with the same API by placing the state accordingly.
Global state
import React from 'react';
import { store, view } from 'react-easy-state';
// this state is defined globally and can be shared between components
const counter = store({
num: 0,
increment: () => counter.num++
});
export default view(() => (
<button onClick={counter.increment}>{counter.num}</button>
));
Local state
import React from 'react';
import { store, view } from 'react-easy-state';
export default view(() => {
// this state is defined inside the component and it is local to the component
const counter = store({
num: 0,
increment: () => counter.num++
});
return (<button onClick={counter.increment}>{counter.num}</button>);
});
So why move under RisingStack?
How does an already stable library benefit from RisingStack's support? The core is pretty much 'done', it didn't need any commits for the last 13 months. The React port - which is React Easy State - is a different story though. You probably know that React is in the middle of an exciting transition period with hooks and the upcoming async API. These changes have to be tied together with the core in an intuitive way which is not an easy task. This is where RisingStack is a huge help.
Together we can react quickly to React changes (pun intended).
Wed Mar 25 2020 02:22:29 GMT+0700 (Western Indonesia Time)
Managing Remote Teams — Use Checklists
Image- Smoke Art Cubes to Smoke — MattysFlicks — (CC BY 2.0)
On remote teams, conveying team norms is a different process from in the office. Office workers can usually stroll to another desk and ask somebody a question whenever one comes up. On remote teams, your team members may work at different times, or be busy with family errands in the middle of the workday (and that’s OK — people should work when they can be most productive).
So how should remote workers communicate the team’s practices and procedures when they can’t just shout, “Hey, how do we do code reviews around here?”
Checklists.
I’ve been using checklists for years. In software development we have many of them, like the SOLID principles on object-oriented design.
But it wasn’t until I read “The Checklist Manifesto” that I realized the true power of checklists, and started making them standard operating procedures on my software teams.
The book describes a study which is particularly relevant today, because as I type this, the world is suffering from the worst global disaster since World War II: The COVID-19 pandemic. The study was conducted by Stephan Luby with support from Proctor & Gamble to test the effectiveness of anti-bacterial soap, and it delivered incredible results: The incidence of various diseases fell 35% — 52%.
But what’s really interesting about this study is that the kind of soap that was used didn’t make a big difference, and the people already had and used soap. The difference was that the study instructions included two checklists — When to wash hands:
Before preparing food or feeding it to others
After sneezing our coughing
After wiping an infant
After using a bathroom
Most people were already washing their hands after using a bathroom, but they weren’t doing it properly. The checklist also included instructions:
Use soap.
Wet both hands completely.
Rub the soap until it forms a thick lather covering both hands completely.
Wash hands for at least 20 seconds [not included in this study, but we know now it takes at least 20 seconds to break down viral bugs including Coronavirus so I’m putting it here for posterity].
Completely rinse the soap off.
It was not the particular soap used — any soap is effective. It was the checklists that prevented illness. The checklists changed behaviors and taught people how and when to properly wash their hands.
If you talk to members of my teams, you’ll discover that we create checklists for lots of things. The best checklists are:
[ ] Short enough to memorize
[ ] Only include the key points
If they get too long, conformance to the checklist drops, as people begin to see checklist points as optional suggestions.
Here are some real examples of the checklists we commonly use on our teams. A few of these (like FIRST and RAIL) are widely used and developed externally. Several others (including 5 Questions, RITE Way, Test Timing, and both CI/CD lists) were developed by me, but inspired by common industry best practices:
Code Review Checklist
Before merging a pull request, check that the following have been considered:
[ ] PR is small enough (otherwise, break it up)
[ ] Code is readable
[ ] Code is tested
[ ] The features are documented
[ ] Files are located and named correctly
[ ] Error states are properly handled
[ ] Bonus: Screenshots/screencast demo included
Code Test Checklist (RITE Way)
In quality software, developers must deliver tests which automatically prove that the code works. To test the RITE Way, each test should be:
[ ] Readable
[ ] Isolated (units and tests)/Integrated (for integration tests)
[ ] Thorough
[ ] Explicit
Test Timing Checklist
[ ] Unit tests run in under 10 seconds
[ ] Functional tests should run in under 10 minutes
[ ] CI/CD checks should run in under 10 minutes
5 Questions Every Unit Test Should Answer
[ ] What is the component under test?
[ ] What is its expected behavior (in human readable form)?
[ ] What is its actual output?
[ ] What is its expected output?
[ ] How do you reproduce a test failure? (Double check that the answers to the above answer this question).
Which is unsurprisingly similar to the bug report checklist, because all failing unit tests should be good bug reports.
Bug Report Checklist
Each bug report should include:
[ ] Description (including location)
[ ] Expected output
[ ] Actual output
[ ] Instructions to reproduce
[ ] Environment (browser/OS versions, extensions)
[ ] Bonus: Screenshot/screencast demonstrating the bug
Component Checklist (FIRST)
Components should follow the FIRST principles:
[ ] Focused
[ ] Independent
[ ] Reusable
[ ] Small
[ ] Testable
Software User Interface (UI) Performance Checklist (RAIL)
Software UIs should conform to the RAIL performance model:
[ ] Respond to user interaction in under 100ms
[ ] Animation frames should draw in under 10ms
[ ] Idle time processes should be batched in blocks of less than 50ms
[ ] Load in under 1 second
Continuous Delivery Preparedness Checklist
[ ] A minimum of 80% of the code is covered by unit tests.
[ ] All critical user workflows are covered by functional tests.
[ ] All critical integrations are covered by integration tests.
[ ] A feature toggle system exists to toggle features on and off in the production environment. All unfinished features are toggled off by default.
CI/CD Checklist
[ ] Each commit to master must first pass through a Pull Request (PR) process. Merging must be blocked until checks pass.
[ ] Each pull request must be peer reviewed before merging into the master branch.
[ ] Each pull request must pass a full suite of automated tests configured to stop the integration process if any tests fail.
[ ] Each commit triggers its own sandboxed build for testing, demonstration and verification. The build link is added to the code review data.
[ ] After all checks pass, merging is unblocked.
[ ] The author of the pull request must OK the merge (or be personally responsible for merge).
[ ] Merging should trigger automatic production deployment of the newly integrated code. Hence, the master branch should always reflect the production product build.
Eric Elliott is the author of the books, “Composing Software” and “Programming JavaScript Applications”. As co-founder of EricElliottJS.com and DevAnywhere.io, he teaches developers essential software development skills. He builds and advises development teams for crypto projects, and has contributed to software experiences for Adobe Systems, Zumba Fitness,The Wall Street Journal,ESPN,BBC, and top recording artists including Usher, Frank Ocean, Metallica, and many more.
He enjoys a remote lifestyle with the most beautiful woman in the world.
Tue Mar 17 2020 17:37:20 GMT+0700 (Western Indonesia Time)
After going through this tutorial, you’ll understand the basics of Ansible - an open-source software provisioning, configuration management, and application-deployment tool.
First, we’ll discuss the Infrastructure as Code concept, and we’ll also take a thorough look at the currently available IaC tool landscape. Then, we’ll dive deep into what is Ansible, how it works, and what are the best practices for its installation and configuration.
You’ll also learn how to automate your infrastructure with Ansible in an easy way.
Okay, let's start with understanding the IaC Concept!
What is Infrastructure as Code?
Since the dawn of complex Linux server architectures, the way of configuring servers was either by using the command line, or by using bash scripts. However, the problem with bash scripts is that they are quite difficult to read, but more importantly, using bash scripts is a completely imperative way.
When relying on bash scripts, implementation details or small differences between machine states can break the configuration process. There’s also the question of what happens if someone SSH-s into the server, configures something through the command line, then later someone would try to run a script, expecting the old state.
The script might run successfully, simply break, or things could completely go haywire. No one can tell.
To alleviate the pain caused by the drawbacks of defining our server configurations by bash scripts, we needed a declarative way to apply idempotent changes to the servers’ state, meaning that it does not matter how many times we run our script, it should always result in reaching the exact same expected state.
This is the idea behind the Infrastructure as Code (IaC) concept: handling the state of infrastructure through idempotent changes, defined with an easily readable, domain-specific language.
What are these declarative approaches?
First, Puppet was born, then came Chef. Both of them were responses to the widespread adoption of using clusters of virtual machines that need to be configured together.
Both Puppet and Chef follow the so-called “pull-based” method of configuration management. This means that you define the configuration - using their respective domain-specific language- which is stored on a server. When new machines are spun up, they need to have a configured client that pulls the configuration definitions from the server and applies it to itself.
Using their domain-specific language was definitely clearer and more self-documenting than writing bash scripts. It is also convenient that they apply the desired configuration automatically after spinning up the machines.
However, one could argue that the need for a preconfigured client makes them a bit clumsy. Also, the configuration of these clients is still quite complex, and if the master node which stores the configurations is down, all we can do is to fall back to the old command line / bash script method if we need to quickly update our servers.
To avoid a single point of failure, Ansible was created.
Ansible, like Puppet and Chef, sports a declarative, domain-specific language, but in contrast to them, Ansible follows a “push-based” method. That means that as long as you have Python installed, and you have an SSH server running on the hosts you wish to configure, you can run Ansible with no problem. We can safely say that expecting SSH connectivity from a server is definitely not inconceivable.
Long story short, Ansible gives you a way to push your declarative configuration to your machines.
Later came SaltStack. It also follows the push-based approach, but it comes with a lot of added features, and with it, a lot of added complexity both usage, and maintenance-wise.
Thus, while Ansible is definitely not the most powerful of the four most common solutions, it is hands down the easiest to get started with, and it should be sufficient to cover 99% of conceivable use-cases.
If you’re just getting started in the world of IaC, Ansible should be your starting point, so let’s stick with it for now.
Other IaC tools you should know about
While the above mentioned four (Pupper, Chef, Salt, Ansible) handles the configuration of individual machines in bulk, there are other IaC tools that can be used in conjunction with them. Let’s quickly list them for the sake of completeness, and so that you don’t get lost in the landscape.
Vagrant: It has been around for quite a while. Contrary to Puppet, Chef, Ansible, and Salt, Vagrant gives you a way to create blueprints of virtual machines. This also means that you can only create VMs using Vagrant, but you cannot modify them. So it can be a useful companion to your favorite configuration manager, to either set up their client, or SSH server, to get them started.
Terraform: Vagrant comes handy before you can use Ansible, if you maintain your own fleet of VMs. If you’re in the cloud, Terraform can be used to declaratively provision VMs, setup networks, or basically anything you can handle with the UI, API, or CLI of your favorite cloud provider. Feature support may vary, depending on the actual provider, and they mostly come with their own IaC solutions as well, but if you prefer not to be locked in to a platform, Terraform might be the best solution to go with.
Kubernetes: Container orchestration systems are considered Infrastructure as Code, as especially with Kubernetes, you have control over the internal network, containers, a lot of aspects of the actual machines, basically it’s more like an OS on it’s own right than anything. However, it requires you to have a running cluster of VMs with Kubernetes installed and configured.
All in all, you can use either Vagrant or Terraform to lay the groundwork for your fleet of VMs, then use Ansible, Puppet, Chef or Salt to handle their configuration continuously. Finally, Kubernetes can give you a way to orchestrate your services on them.
Are you looking for expert help with infrastructure related issues or project? Check out our DevOps and Infrastructure related services, or reach out to us at info@risingstack.com.
We’ve previously written a lot about Kubernetes, so this time we’ll take one step and take a look at our favorite remote configuration management tool:
What is Ansible?
Let’s take apart what we already know:
Ansible is a push-based IaC, providing a user-friendly domain-specific language so you can define your desired architecture in a declarative way.
Being push-based means that Ansible uses SSH for communicating between the machine that runs Ansible and the machines the configuration is being applied to.
The machines we wish to configure using Ansible are called managed nodes or hosts. In Ansible’s terminology, the list of hosts is called an inventory.
The machine that reads the definition files and runs Ansible to push the configuration to the hosts is called a control node.
How to Install Ansible
It is enough to install Ansible only on one machine, the control node.
Control node requirements are the following:
Python 2 (version 2.7) or Python 3 (versions 3.5 and higher) installed
Windows is not supported as a control node, but you can set it up on Windows 10 using WSL
The preferred way to install Ansible on a Mac is via pip.
pip install --user ansible
Run the following command to verify the installation:
ansible --version
Ansible Setup, Configuration, and Automation
For the purposes of this tutorial, we’ll set up a Raspberry Pi with Ansible, so even if the SD card gets corrupted, we can quickly set it up again and continue working with it.
Flash image (Raspbian)
Login with default credentials (pi/raspberry)
Change default password
Set up passwordless SSH
Install packages you want to use
With Ansible, we can automate the process.
Let’s say we have a couple of Raspberry Pis, and after installing the operating system on them, we need the following packages to be installed on all devices:
vim
wget
curl
htop
We could install these packages one by one on every device, but that would be tedious. Let Ansible do the job instead.
First, we’ll need to create a project folder.
mkdir bootstrap-raspberry && cd bootstrap-raspberry
We need a config file and a hosts file. Let’s create them.
touch ansible.cfg
touch hosts // file extension not needed
Ansible can be configured using a config file named ansible.cfg. You can find an example with all the options here.
Security risk: if you load ansible.cfg from a world-writable folder, another user could place their own config file there and run malicious code. More about that here.
The lookup order of the configuration file will be searched for in the following order:
ANSIBLE_CONFIG (environment variable if set)
ansible.cfg (in the current directory)
~/.ansible.cfg (in the home directory)
/etc/ansible/ansible.cfg
So if we have an ANSIBLE_CONFIG environment variable, Ansible will ignore all the other files(2., 3., 4.). On the other hand, if we don’t specify a config file, /etc/ansible/ansible.cfg will be used.
Now we’ll use a very simple config file with contents below:
Here we tell Ansible that we use our hosts file as an inventory and to not check host keys. Ansible has host key checking enabled by default. If a host is reinstalled and has a different key in the known_hosts file, this will result in an error message until corrected. If a host is not initially in known_hosts this will result in prompting for confirmation interactively which is not favorable if you want to automate your processes.
We list the IP address of the Raspberry Pis under the [raspberries] block and then assign variables to them.
ansible_connection: Connection type to the host. Defaults to ssh. See other connection types here
ansible_user: The user name to use when connecting to the host
ansible_ssh_password: The password to use to authenticate to the host
Creating an Ansible Playbook
Now we’re done with the configuration of Ansible. We can start setting up the tasks we would like to automate. Ansible calls the list of these tasks “playbooks”.
In our case, we want to:
Change the default password,
Add our SSH public key to authorized_keys,
Install a few packages.
Meaning, we’ll have 3 tasks in our playbook that we’ll call pi-setup.yml.
By default, Ansible will attempt to run a playbook on all hosts in parallel, but the tasks in the playbook are run serially, one after another.
Let’s take a look at our pi-setup.yml as an example:
- hosts: all
become: 'yes'
vars:
user:
- name: "pi"
password: "secret"
ssh_key: "ssh-rsa …"
packages:
- vim
- wget
- curl
- htop
tasks:
- name: Change password for default user
user:
name: '"{{ item.name }}"'
password: '"{{ item.password | password_hash('sha512') }}"'
state: present
loop:
- '"{{ user }}"'
- name: Add SSH public key
authorized_key:
user: '"{{ item.name }}"'
key: '"{{ item.ssh_key }}"'
loop:
- '"{{ user }}"'
- name: Ensure a list of packages installed
apt:
name: '"{{ packages }}"'
state: present
- name: All done!
debug:
msg: Packages have been successfully installed
This part defines fields that are related to the whole playbook:
hosts: all: Here we tell Ansible to execute this playbook on all hosts defined in our hostfile.
become: yes: Execute commands as sudo user. Ansible uses privilege escalation systems to execute tasks with root privileges or with another user’s permissions. This lets you become another user, hence the name.
vars: User defined variables. Once you’ve defined variables, you can use them in your playbooks using the Jinja2 templating system.There are other sources vars can come from, such as variables discovered from the system. These variables are called facts.
tasks: List of commands we want to execute
Let’s take another look at the first task we defined earlier without addressing the user modules’ details. Don’t fret if it’s the first time you hear the word “module” in relation to Ansible, we’ll discuss them in detail later.
tasks:
- name: Change password for default user
user:
name: '"{{ item.name }}"'
password: '"{{ item.password | password_hash('sha512') }}"'
state: present
loop:
- '"{{ user }}"'
name: Short description of the task making our playbook self-documenting.
user: The module the task at hand configures and runs. Each module is an object encapsulating a desired state. These modules can control system resources, services, files or basically anything. For example, the documentation for the user module can be found here. It is used for managing user accounts and user attributes.
loop: Loop over variables. If you want to repeat a task multiple times with different inputs, loops come in handy. Let’s say we have 100 users defined as variables and we’d like to register them. With loops, we don’t have to run the playbook 100 times, just once.
Ansible comes with a number of modules, and each module encapsulates logic for a specific task/service. The user module above defines a user and its password. It doesn’t matter if it has to be created or if it’s already present and only its password needs to be changed, Ansible will handle it for us.
Note that Ansible will only accept hashed passwords, so either you provide pre-hashed characters or - as above - use a hashing filter.
Are you looking for expert help with infrastructure related issues or project? Check out our DevOps and Infrastructure related services, or reach out to us at info@risingstack.com.
For the sake of simplicity, we stored our user’s password in our example playbook, but you should never store passwords in playbooks directly. Instead, you can use variable flags when running the playbook from CLI or use a password store such as Ansible Vault or the 1Password module .
Most modules expose a state parameter, and it is best practice to explicitly define it when it’s possible. State defines whether the module should make something present (add, start, execute) or absent (remove, stop, purge). Eg. create or remove a user, or start / stop / delete a Docker container.
Notice that the user module will be called at each iteration of the loop, passing in the current value of the user variable . The loop is not part of the module, it’s on the outer indentation level, meaning it’s task-related.
The Authorized Keys Module
The authorized_keys module adds or removes SSH authorized keys for a particular user’s account, thus enabling passwordless SSH connection.
The task above will take the specified key and adds it to the specified user’s ~/.ssh/authorized_keys file, just as you would either by hand, or using ssh-copy-id.
The Apt module
We need a new vars block for the packages to be installed.
vars:
packages:
- vim
- wget
- curl
- htop
tasks:
- name: Ensure a list of packages installed
apt:
name: '"{{ packages }}"'
state: present
The apt module manages apt packages (such as for Debian/Ubuntu). The name field can take a list of packages to be installed. Here, we define a variable to store the list of desired packages to keep the task cleaner, and this also gives us the ability to overwrite the package list with command-line arguments if we feel necessary when we apply the playbook, without editing the actual playbook.
The state field is set to be present, meaning that Ansible should install the package if it’s missing, or skip it, if it’s already present. In other words, it ensures that the package is present. It could be also set to absent (ensure that it’s not there), latest (ensure that it’s there and it’s the latest version, build-deps (ensure that it’s build dependencies are present), or fixed (attempt to correct a system with broken dependencies in place).
Let’s run our Ansible Playbook
Just to reiterate, here is the whole playbook together:
- hosts: all
become: 'yes'
vars:
user:
- name: "pi"
password: "secret"
ssh_key: "ssh-rsa …"
packages:
- vim
- wget
- curl
- htop
tasks:
- name: Change password for default user
user:
name: '"{{ item.name }}"'
password: '"{{ item.password | password_hash('sha512') }}"'
state: present
loop:
- '"{{ user }}"'
- name: Add SSH public key
authorized_key:
user: '"{{ item.name }}"'
key: '"{{ item.ssh_key }}"'
loop:
- '"{{ user }}"'
- name: Ensure a list of packages installed
apt:
name: '"{{ packages }}"'
state: present
- name: All done!
debug:
msg: Packages have been successfully installed
Now we’re ready to run the playbook:
ansible-playbook pi-setup.yml
Or we can run it with overwriting the config file:
The command-line flags used in the snippet above are:
-i (inventory): specifies the inventory. It can either be a comma-separated list as above, or an inventory file.
-e (or --extra-vars): variables can be added or overridden through this flag. In our case we are overwriting the configuration laid out in our hosts file (ansible_user, ansible_ssh_pass) and the variables user and packages that we have previously set up in our playbook.
What to use Ansible for
Of course, Ansible is not used solely for setting up home-made servers.
Ansible is used to manage VM fleets in bulk, making sure that each newly created VM has the same configuration as the others. It also makes it easy to change the configuration of the whole fleet together by applying a change to just one playbook.
But Ansible can be used for a plethora of other tasks as well. If you have just a single server running in a cloud provider, you can define its configuration in a way that others can read and use easily. You can also define maintenance playbooks as well, such as creating new users and adding the SSH key of new employees to the server, so they can log into the machine as well.
Or you can use AWX or Ansible Tower to create a GUI based Linux server management system that provides a similar experience to what Windows Servers provide.
Stay tuned and subscribe to our newsletter! You can find the subscribe box in the left column, on the top of the article.
Next time, we’ll dive deeper into an enterprise use case of Ansible with AWX.
Mon Mar 16 2020 03:33:24 GMT+0700 (Western Indonesia Time)
The Remote Worker’s Home Office Equipment Guide
Home Office
Last Updated: December 2020
Setting up your remote work space can be daunting. You’ll be confronted with dozens of purchasing decisions, and you may feel like you need to do a lot of research. I build and advise remote development teams as part of my regular work, and have been doing so since 2014. I’ve looked at all the microphones and headsets, furniture, and accessories, so you can gear up quickly and get right to work.
Here are my current recommendations.
Note: Purchase using these links to support more great, free content.
A Fast Computer
Remote software development is CPU and memory intensive. You’ll often be recording and transcoding video clips, screen sharing or video chatting while compiling and interacting with a web browser.
Lots of computers will struggle with those demands. You’ll start an npm install and the video will drop frames. Grab at least 16 GB of RAM for best results. 32 GB is better. A current MacBook Pro will do a great job.
I recently purchased the 16" 8-core i9. It’s a great machine. It’s lighter, smaller, and still manages to pack an extra inch of screen real-estate into the compact package. I love the new keyboard, touch bar, and touch ID, and I don’t miss the old function keys. Apple recently announced the new M1 laptops.
New MacBooks only have USB-C compatible Thunderbolt 3 ports. You’ll probably need to connect to USB 3, HDMI, and memory cards. You can get a connector hub that has all of those built-in.
Ideally, you’ll want to mount your laptop on a high stand to bring your screen and video camera up to eye level. Doing so will make you more comfortable, allow you to easily adjust your camera for video conferencing, and probably improve your health, but it will also put the built-in keyboard and trackpad out of easy reach.
In my opinion, nothing beats the Apple Magic Keyboard and Apple Magic Trackpad for productivity. Syncing is easy. There are no battery replacements to worry about. Plug them in with the included cable, and you can charge them while you work.
If you plan to do any gaming to relax when you’re not working, you’ll want a real mouse. Trackpads just won’t do it. The best mice out there are designed for gamers. Check out the Logitech G Pro Wireless.
A built-in mic is OK, but it’s not ideal for video chats. First, it’s too close to the speakers, so if the speakers are too loud, it will pick up your coworker’s voices and echo back to them, which can be very distracting. Second, it’s not very good at rejecting sound that’s farther away, so it’ll pick up all the background noise.
If you want your coworkers to really hear you clearly, pick up a better external mic. Choose a dynamic mic rather than a condenser mic. You need to speak directly into a dynamic mic for it to pick up the sound well. That’s a good thing, because it automatically filters out most of the background noise.
I’ve tried a whole lot of mics over the years, and I keep circling back to the Shure Beta 58A. This is a professional mic commonly used by professional musicians on stage, which means it’s not a USB mic. That’s OK.
You’ll need a USB audio interface. My favorite is the Scarlet 2i2. While you’re at it, pick up an adjustable boom stand for the mic. There are good ones that clamp to your desk.
The MacBook Pro monitor is great, but even a 16" monitor is a bit small. While I’m coding, I usually have a browser and terminal on one screen, and an IDE on the other. Having plenty of screen real-estate can help you be up to 20% more productive. It’s worth splurging on a nice ultra wide. While you’re at it, pick up a desk mountable, adjustable stand. My favorite is the VARIDESK Vari Monitor arm + Laptop Stand.
If your surroundings are loud, first, remember your coworkers and mute yourself when you’re not talking. Second, you may want to block out the noise for yourself. A pair of comfortable, over-ear, closed-back headphones might come in handy. It’s hard to do better than the Beyerdynamic DT 1770 Pro.
If you are in a particularly noisy environment you may want to get some cans with active noise canceling. Many of those also offer wireless connectivity. The Sennheiser Momentum 3 offers best-in-class sound and a more natural sound signature helps you avoid ear fatigue. It also offers a transparent mode so you can have conversations or hear your surroundings without taking them off.
Sometimes you might want to tune into a meeting without looking like you’re hiding in some gigantic over-ear headphones. Sennheiser has you covered with the Momentum True Wireless Earbuds. I find these far more comfortable than the ubiquitous Apple AirPods. Despite their popularity, AirPods don’t comfortably fit all ears, don’t offer different size or ear shape options, and can’t hold a candle to Sennheiser on comfort or sound quality.
If you don’t need the noise isolation, the AKG K 701 will let your ears breathe and offer more transparent, detailed, expansive sound than any of the other options here. If you’re looking for the best sound quality to enjoy some great sounding music while you work, with great comfort and build quality, these are the ones to buy.
Sick of headphones? Check out the Beats Pill+ bluetooth speaker. It’s hard to believe such great sound can come out of such a small package. Compact, loud, and plenty of punch.
For best results, you don’t want a big window with bright sunlight directly behind you. Your indoor lighting won’t be able to compete with the sun, and your face will be lost in shadow on your video calls. Instead, you want good illumination. I used to use a pair of brightness and color adjustable LED panel desk lamps which I set up on the left and right sides of my desk. Now I use desk mountable LED panels to free up desk space.
The panels are bigger, which makes it possible to position them a little further away and retain the softness. They also get brighter than the lamps, so they can more easily compete with and overpower a bright background, like a window.
Many people make the mistake of skipping the lights. Don’t make that mistake. Good lighting is an inexpensive way to dramatically improve the experience of video calls. Even an inexpensive lamp can make a dramatic difference.
You’re going to spend a lot of time sitting. You need a good chair. My favorite is the Herman Miller Aeron chair. I would say it’s the Rolls-Royce of office chairs, but it’s not about luxury. It’s about posture, comfort, and health. A cheap chair could lead to far more expensive back trouble. Besides, it looks a lot more professional than a gaming chair.
Eric Elliott is the author of the books, “Composing Software” and “Programming JavaScript Applications”. As co-founder of EricElliottJS.com and DevAnywhere.io, he teaches developers essential software development skills. He builds and advises development teams for crypto projects, and has contributed to software experiences for Adobe Systems, Zumba Fitness,The Wall Street Journal,ESPN,BBC, and top recording artists including Usher, Frank Ocean, Metallica, and many more.
He enjoys a remote lifestyle with the most beautiful woman in the world.
Gear Up for Remote Work was originally published in JavaScript Scene on Medium, where people are continuing the conversation by highlighting and responding to this story.
Mon Mar 02 2020 16:45:17 GMT+0700 (Western Indonesia Time)
In the previous blog post we learned how to decorate a field of a class with attributes to adjust the Json serialization to our needs. This post is about serializing fields of type TObjectList<T> or descendants thereof.
Let’s recap the problem and the final question: The Json serializer does a good job for array of objects, but fails miserably on TObjectList<T> fields.
What can we do to make serializing generic object lists being serialized properly in both directions?
As seen in the previous post, our best bet will be some neat attributes to decorate the fields with. The JsonUTCDate attribute served well, so what about a JsonObjectList attribute registering some fancy interceptor handling the nitty-gritty details. As you might have guessed, this time it is not that easy.
To populate a generic object list, the serializer must create the individual objects. For that it needs to know the type of these objects. For arrays that is already handled inside TJSONUnMarshal.JSONToTValue by asking RTTI for the ElementType. For a generic object list we must provide that type, so we declare a generic TObjectListInterceptor:
type
TObjectListInterceptor<T: class> = class(TJSONInterceptor)
public
procedure AfterConstruction; override;
function ObjectsConverter(Data: TObject; Field: string): TListOfObjects; override;
procedure ObjectsReverter(Data: TObject; Field: string; Args: TListOfObjects); override;
end;
implementation
procedure TObjectListInterceptor<T>.AfterConstruction;
begin
inherited;
ObjectType := T;
end;
function TObjectListInterceptor<T>.ObjectsConverter(Data: TObject; Field: string): TListOfObjects;
var
I: Integer;
ctx: TRTTIContext;
list: TObjectList<T>;
begin
list := TObjectList<T>(ctx.GetType(Data.ClassType).GetField(Field).GetValue(Data).AsObject);
SetLength(Result, list.Count);
for I := 0 to list.Count - 1 do
Result[I] := list.Items[I];
end;
procedure TObjectListInterceptor<T>.ObjectsReverter(Data: TObject; Field: string; Args: TListOfObjects);
var
ctx: TRTTIContext;
list: TObjectList<T>;
obj: TObject;
begin
list := TObjectList<T>(ctx.GetType(Data.ClassType).GetField(Field).GetValue(Data).AsObject);
list.Clear;
for obj in Args do
list.Add(T(obj));
end;
The implementation doesn’t look that complicated, but I want to make clear that we never set the field value! We only use GetValue to get hands on the actual list instance. This has some consequences later, so we better remember it.
The JsonObjectList attribute takes the actual interceptor class as a parameter and registers it a s ctObjects converter and rtObjects reverter:
type
JsonObjectListAttribute = class(JsonReflectAttribute)
public
constructor Create(InterceptorType: TClass);
end;
implementation
constructor JsonObjectListAttribute.Create(InterceptorType: TClass);
begin
inherited Create(ctObjects, rtObjects, InterceptorType);
end;
Let me emphasize the difference of a rtObjects and a rtTypeObjects reverter. The corresponding methods have the following signatures:
You can see that ObjectsReverter is meant to handle the Args list (which is basically an array of TObject) by doing whatever is necessary to the Field of the Data object. Meanwhile the TypeObjectsReverter must return an instance built from the Args list, which is going to replace any existing instance present in the object field. For this to work, we need the actual type of the list – in addition to the element type.
The cast to TObjectList<T> seen above works simply because we are acting on the actual field instance with the correct type and it just happens that the called methods Count, Clear and Add wire directly on the FListHelper instance unaffected of the actual type <T>.
The choose of a rtObjects reverter requires the element type as the only generic type parameter. I will later explain why a derived TObjectList<T> cannot be decorated with a rtTypeObjects attribute, ruling out such an approach.
Now we want to make use of the new attribute and see how it works for a generic object list field of our class.
type
TMyAddressBook = class
private
[JsonObjectList(TObjectListListInterceptor<TContact>)]
FContacts: TObjectList<TContact>;
Unfortunately that doesn’t even compile! It turned out that the compiler is not able to resolve the instantiated generic type TObjectListListInterceptor<TContact> used as a parameter for the JsonObjectList attribute. We have to declare an alias for that to make it work.
type
TContactList = TIdentList<TContact>;
TContactListInterceptor = TObjectListInterceptor<TContact>;
type
TMyAddressBook = class
private
[JsonObjectList(TContactListInterceptor)]
FContacts: TContactList;
...
Note that we need at least one type keyword between the alias and its use inside the attribute.
Are we finished now?
Ehm, no! Perhaps you remember me saying “I want to make clear that we never set the field value!”. That sentence assumes that there already is an instance of TContactList present in the FContacts field.
No problem, we can create that instance in the constructor and free it in the destructor. We probably would have done that anyway. Unfortunately that isn’t enough. The standard implementation replaces all instances in the fields with nil before doing any de-serialization of an object and frees those saved field instances after the field gets a new valid instance created in between –
– unless we tell not to do so.
The attribute for skipping the destruction of the field instances is JSONOwned with parameter False. The final attribute decoration for a generic object list field now looks like this:
type
TMyAddressBook = class
private
[JSONOwned(False), JsonObjectList(TContactListInterceptor)]
FContacts: TContactList;
...
There we are! Now we are able to use generic object lists as fields while still serializing them as object arrays and vice versa. The additional declaration of an interceptor alias and the per field decoration with some attributes seems acceptable given this advantage.
Why no attribute directly for TContactList?
You remember that the TypeObjectsReverter needs to know the actual list class. A possible declaration might be TObjectListInterceptor<T: class, ListT: TObjectList<T>>, which is indeed possible to implement. The problem is the use of the attribute which would have to be like this:
Unfortunately this doesn’t compile, because TContactListInterceptor is not fully defined when used in the attribute. We need to fully define the interceptor class using TContactList before we can decorate TContactList with that attribute. If anyone comes up with a workaround, tell me.
Mon Mar 02 2020 16:44:33 GMT+0700 (Western Indonesia Time)
Serializing objects to Json as well as de-serializing them with the Delphi standard libraries has been subject to many discussions. While the majority suggests to use another library or a self implemented solution, there are others who would prefer the built-in tools for a couple of reasons. Simplicity and the availability with every (decent) Delphi installation being the most mentioned ones.
The ease and elegance of a TRESTRequest.AddBody<T>(myInstance) call is hard to attain with other means. I guess it is not myself alone being tempted to make use of it. With a bit of care taken when designing the objects to serialize the results are often quite satisfying and fit the requirements. Nourishing this with some advanced techniques shown in this post may be enough to keep the benefits without the need for external code.
If we inspect the above mentioned generic AddBody method we soon find out that the serializing part is outsourced to the TJson.ObjectToJsonObject method. We make a note that the call just accepts the default TJsonOptions for the second parameter.
Without any tweaking the Json serializer takes each field of the class, where it does a pretty good job for simple (value) types, objects and arrays of both. In reality the use of object arrays as fields inside a class is rarely a valid approach. Generic object lists derived from TObjectList<T> are way more feasible and thus the preferred way to go. Unfortunately those are not handled pretty well and in most cases are they even not what a non Delphi counterparts accept or deliver – mostly they use arrays for these lists. The ultimate question now is:
What can we do to make serializing generic object lists being serialized properly in both directions?
I hate to disappoint you, but the generic object lists will be covered in the next blog post, while this one tackles an easier task – it would have been too long otherwise.
Although the Json serializing is quite resistant to extensions, there are means to achieve more than appears possible on a first look. The allies in this endeavor are attributes.
Let’s start with a simple task as a warm-up. As mentioned above, the AddBody method uses the default TJsonOptions for the ObjectToJsonObject call, which are joDateIsUTC and joDateFormatISO8601. While the date format is not a bad choice, the requirements to provide UTC dates may force some work unwanted on us. What if we could just say: Hey, this is a TDateTime field, but I want it to be converted to UTC in the Json representation. In addition there should be a null date equivalent to the ISO string “0000-00-00T00:00:00.000Z”, but the Json for that shall be a null value for these instead of that string value. To abbreviate this information we want an attribute named JsonUTCDate, so that a field declaration should look like this:
OK, this is the new attribute declaration and its implementation:
type
JsonUTCDateAttribute = class(JsonReflectAttribute)
public
constructor Create;
end;
implementation
constructor JsonUTCDateAttribute.Create;
begin
inherited Create(ctObject, rtString, TUTCDateTimeInterceptor);
end;
Pretty simple – because we delegate the actual work to a class named TUTCDateTimeInterceptor, which we will have a look at later. For the moment we notice that the JsonUTCDate attribute registers different types for the converter and the reverter. The interceptor acts as a ctObject converter, but as a rtString reverter. While we could accomplish most of the task also with a ctString converter, the demand for the null value requires us to exchange the Json string value with a Json null value. A ctString converter cannot be used for that.
The TUTCDateTimeInterceptor is derived from TJSONInterceptor and overrides the methods ObjectConverter and StringReverter according to the values given in JsonUTCDateAttribute.Create. The implementation for StringReverter is pretty straight forward based on the original implementation found in TISODateTimeInterceptor decorated with a call to a small function ToLocalTime, which takes care of the null date value (We don’t want the null date being converted to local time, do we?):
const
cNoDate = -DateDelta;
function IsNoDate(ADate: TDateTime): Boolean;
begin
Result := Round(ADate) = cNoDate;
end;
function TUTCDateTimeInterceptor.ToLocalTime(const ADateTime: TDateTime): TDateTime;
begin
Result := ADateTime;
if not IsNodate(Result) then
Result := TTimeZone.Local.ToLocalTime(Result);
end;
procedure TUTCDateTimeInterceptor.StringReverter(Data: TObject; Field, Arg: string);
var
ctx: TRTTIContext;
datetime: TDateTime;
begin
datetime := ToLocalTime(ISO8601ToDate(Arg));
ctx.GetType(Data.ClassType).GetField(Field).SetValue(Data, datetime);
end;
The ObjectConverter method is a bit more sophisticated to achieve the null value requirement:
function TUTCDateTimeInterceptor.ToUniversalTime(const ADateTime: TDateTime; const ForceDaylight: Boolean): TDateTime;
begin
Result := ADateTime;
if not IsNoDate(Result) then
Result := TTimeZone.Local.ToUniversalTime(Result, ForceDaylight);
end;
function TUTCDateTimeInterceptor.ObjectConverter(Data: TObject; Field: string): TObject;
var
ctx: TRTTIContext;
date: TDateTime;
begin
Result := nil;
date := ctx.GetType(Data.ClassType).GetField(Field).GetValue(Data).AsType<TDateTime>;
if IsNoDate(date) then Exit;
StringProxy.Value := DateToISO8601(ToUniversalTime(date));
result := StringProxy;
end;
First it takes the current date value from the field and checks for the null date, exiting with a nil result if found. A nil object will end up as a null in the Json string.
For all other dates we convert to UTC with the ToUniversalTime method. Alas, we cannot return the resulting string directly – we need to return an object. For this we use a local instance of a TStringProxy object, for which we have taken ownership to avoid memory leaks. The TStringProxy class is decorated with ctTypeString interceptor to just retrieve the plain string. If we omit that we get an inner object containing the value as a separate field instead of just the value for the current TDateTime field.
This is the complete class declaration for TUTCDateTimeInterceptor together with the missing methods:
type
TUTCDateTimeInterceptor = class(TJSONInterceptor)
private type
TStringProxyInterceptor = class(TJSONInterceptor)
public
function TypeStringConverter(Data: TObject): string; override;
end;
[JsonReflect(ctTypeString, rtTypeString, TStringProxyInterceptor)]
TStringProxy = class
private
FValue: string;
public
property Value: string read FValue write FValue;
end;
var
FStringProxy: TStringProxy;
function GetStringProxy: TStringProxy;
strict protected
function ToLocalTime(const ADateTime: TDateTime): TDateTime;
function ToUniversalTime(const ADateTime: TDateTime; const ForceDaylight: Boolean = False): TDateTime;
property StringProxy: TStringProxy read GetStringProxy;
public
destructor Destroy; override;
procedure StringReverter(Data: TObject; Field: string; Arg: string); override;
function ObjectConverter(Data: TObject; Field: string): TObject; override;
end;
function TUTCDateTimeInterceptor.GetStringProxy: TStringProxy;
begin
if FStringProxy = nil then begin
FStringProxy := TStringProxy.Create;
end;
Result := FStringProxy;
end;
destructor TUTCDateTimeInterceptor.Destroy;
begin
FStringProxy.Free;
inherited Destroy;
end;
Mon Mar 02 2020 16:24:48 GMT+0700 (Western Indonesia Time)
Abu Isḥāq al-Ilbīrī al-Tujībī (d. 459 AH / 1067 CE) is said to have written this poem in response to a young man who had insulted him. Instead of replying in kind, which was the custom of poets, he decided to respond by providing the young man advice that would benefit him in this life and the next. This is part 2 of the explanation and commentary on this poem which will hopefully help you appreciate it even more insha’Allah.
Sat Feb 29 2020 14:40:59 GMT+0700 (Western Indonesia Time)
How your team actually writes its code is very important if your organization is trying to build products in an Agile way. This post considers the risks associated with insufficiently Agile coding practices and explains how to identify them before they become major issues.
Nearly every software organization has high ambitions for increasing their agility and yours is probably one of them. It’s common to bring in experienced coaches to help teams operate with more agility and to discover ways of delivering more value. But, if you’re working on software products, you’ll find it’s hard to realize some of the benefits of Agile without changing the behaviour of developers in the codebase. Too many coaching efforts place little or no emphasis there.
Agile Coaching helps your business to become more successful by improving the way you plan and deliver software. Technical Agile Coaching specifically focuses on how people write code. How do you know if you need Technical Agile Coaching? Here are three signs.
You spend more time fixing bugs than building new features
Look at all the tasks you work on each week. Ask yourself how much time is being spent on innovative new features, and how much on fixing defects in existing features? For some teams the answer can be as little as 5% of time spent on proactive new work. Now ask yourself – how much more money would our organization make if we spent less time on fixes and more on delivering new features?
Turning this situation around is about increasing the quality of your work so that fewer fixes are needed, resulting in more time for innovation. Often, the root cause of defects is technical debt and code that is hard to understand and change.
You can mitigate against this by training your developers to build in quality from the start. Technical Agile Coaching helps teams to improve automated tests and reduce technical debt by demonstrating various techniques and practices for evolving design safely.
Delivery of new features is delayed, sometimes more than once
Are your new features around 80% done for long periods and then take forever to be actually ready for release? Often this is the biggest complaint from customers and other stakeholders. How much would it be worth to your organization for new functionality to be available reliably and on time?
Late deliveries are often caused by developers not collaborating effectively in the code. To build a new feature they need to bring the whole team’s expertise to bear, and integrate their work seamlessly. Typically, the coding work is not divided up in a way that makes collaboration easy, and changes are not integrated until late in the process.
Technical Agile Coaching helps developers to deliver on time: reliable automated regression tests promote better collaboration with a shared view of the current status; teams learn to divide up the coding work and integrate changes far more frequently than the interval between external deliveries; developers learn to use their tools better and to communicate effectively within the team so they can complete tasks more reliably.
Developers complain the code is so bad they need to re-write the whole thing
Sometimes developers ask for a hiatus in new feature development for several months, even a year, so they can start over by rebuilding the same functionality using new tools and frameworks. This is a significant cost to your business, and a large risk. A more staged approach carries far less risk and allows you to build better functionality with much more manageable cost.
Usually, an organization arrives in this situation after many years of accumulated technical debt. The technologies chosen originally become outdated and are not upgraded in a timely way. Developers make design decisions and then leave without fully documenting or otherwise transferring design knowledge to new team members. New features are added that were not anticipated in the original design. Gradually the code quality declines and it becomes harder and harder to work with.
Technical Agile Coaching helps developers gain better control over existing code, so they can continue working with it and building new features. Teams learn to migrate code to newer technologies in a series of smaller, less risky steps, adding new functionality as they go. Developers learn to pay off technical debt and to communicate better about design decisions.
Benefits of Technical Agile Coaching
Technical Agile Coaching helps developers to change the way they work, day to day, minute by minute, in their codebase. They learn to increase the quality of the code in their product and work more effectively as a team. The coach works closely with the developers while they are writing code to remind, reinforce, teach, and demonstrate Agile practices. With Technical Agile Coaching you should expect to see the following benefits:
Reductions in technical debt
Better automated regression tests
Improved communication between developers within the team
Smaller, safer changes integrated often and documented well
Improved effectiveness using team development tools and IDEs.
Technical Agile Coaching helps a team to improve how they write code, and begin to use more effective agile development practices together.
If you’re interested in getting some Technical Agile Coaching, please contact us at ProAgile. We have many coaches with a lot of experience in agile development and several with technical coaching expertise.
Tue Feb 25 2020 16:10:50 GMT+0700 (Western Indonesia Time)
Abu Isḥāq al-Ilbīrī al-Tujībī (d. 459 AH / 1067 CE) is said to have written this poem in response to a young man who had insulted him. Instead of replying in kind, which was the custom of poets, he decided to respond by providing the young man advice that would benefit him in this life and the next. This is part 1 of the explanation and commentary on this poem which will hopefully help you appreciate it even more insha’Allah.
Mon Feb 17 2020 11:00:00 GMT+0700 (Western Indonesia Time)
In this article, you will learn how you can simplify your callback or Promise based Node.js application with async functions (async/await).
Whether you’ve looked at async/await and promises in javascript before, but haven’t quite mastered them yet, or just need a refresher, this article aims to help you.
A note from the authors:
We re-released our number one article on the blog called "Mastering Async Await in Node.js" which has been read by more than 400.000 developers in the past 3 years.
This staggering 2000 word essay is usually the Nr. 1 result when you Google for Node.js Async/Await info, and for a good reason.
It's full of real-life use cases, code examples, and deep-diving explanations on how to get the most out of async/await. Since it's a re-release, we fully updated it with new code examples, as there are a lot of new Node.js features since the original release which you can take advantage of.
What are async functions in Node?
Async functions are available natively in Node and are denoted by the async keyword in their declaration. They always return a promise, even if you don’t explicitly write them to do so. Also, the await keyword is only available inside async functions at the moment - it cannot be used in the global scope.
In an async function, you can await any Promise or catch its rejection cause.
So if you had some logic implemented with promises:
Currently in Node you get a warning about unhandled promise rejections, so you don’t necessarily need to bother with creating a listener. However, it is recommended to crash your app in this case as when you don’t handle an error, your app is in an unknown state. This can be done either by using the --unhandled-rejections=strict CLI flag, or by implementing something like this:
Automatic process exit will be added in a future Node release - preparing your code ahead of time for this is not a lot of effort, but will mean that you don’t have to worry about it when you next wish to update versions.
Patterns with async functions
There are quite a couple of use cases when the ability to handle asynchronous operations as if they were synchronous comes very handy, as solving them with Promises or callbacks requires the use of complex patterns.
Since node@10.0.0, there is support for async iterators and the related for-await-of loop. These come in handy when the actual values we iterate over, and the end state of the iteration, are not known by the time the iterator method returns - mostly when working with streams. Aside from streams, there are not a lot of constructs that have the async iterator implemented natively, so we’ll cover them in another post.
Retry with exponential backoff
Implementing retry logic was pretty clumsy with Promises:
Not as hideous as the previous example, but if you have a case where 3 asynchronous functions depend on each other the following way, then you have to choose from several ugly solutions.
functionA returns a Promise, then functionB needs that value and functionC needs the resolved value of both functionA's and functionB's Promise.
With this solution, we get valueA from the surrounding closure of the 3rd then and valueB as the value the previous Promise resolves to. We cannot flatten out the Christmas tree as we would lose the closure and valueA would be unavailable for functionC.
Solution 2: Moving to a higher scope
function executeAsyncTask () {
let valueA
return functionA()
.then((v) => {
valueA = v
return functionB(valueA)
})
.then((valueB) => {
return functionC(valueA, valueB)
})
}
In the Christmas tree, we used a higher scope to make valueA available as well. This case works similarly, but now we created the variable valueA outside the scope of the .then-s, so we can assign the value of the first resolved Promise to it.
This one definitely works, flattens the .then chain and is semantically correct. However, it also opens up ways for new bugs in case the variable name valueA is used elsewhere in the function. We also need to use two names — valueA and v — for the same value.
There is no other reason for valueA to be passed on in an array together with the Promise functionB then to be able to flatten the tree. They might be of completely different types, so there is a high probability of them not belonging to an array at all.
You can, of course, write a helper function to hide away the context juggling, but it is quite difficult to read, and may not be straightforward to understand for those who are not well versed in functional magic.
By using async/await our problems are magically gone:
This is similar to the previous one. In case you want to execute several asynchronous tasks at once and then use their values at different places, you can do it easily with async/await:
As we've seen in the previous example, we would either need to move these values into a higher scope or create a non-semantic array to pass these values on.
Array iteration methods
You can use map, filter and reduce with async functions, although they behave pretty unintuitively. Try guessing what the following scripts will print to the console:
map
function asyncThing (value) {
return new Promise((resolve) => {
setTimeout(() => resolve(value), 100);
});
}
async function main () {
return [1,2,3,4].map(async (value) => {
const v = await asyncThing(value);
return v * 2;
});
}
main()
.then(v => console.log(v))
.catch(err => console.error(err));
filter
function asyncThing (value) {
return new Promise((resolve) => {
setTimeout(() => resolve(value), 100);
});
}
async function main () {
return [1,2,3,4].filter(async (value) => {
const v = await asyncThing(value);
return v % 2 === 0;
});
}
main()
.then(v => console.log(v))
.catch(err => console.error(err));
If you log the returned values of the iteratee with map you will see the array we expect: [ 2, 4, 6, 8 ]. The only problem is that each value is wrapped in a Promise by the AsyncFunction.
So if you want to get your values, you'll need to unwrap them by passing the returned array to a Promise.all:
Originally, you would first wait for all your promises to resolve and then map over the values:
function main () {
return Promise.all([1,2,3,4].map((value) => asyncThing(value)));
}
main()
.then(values => values.map((value) => value * 2))
.then(v => console.log(v))
.catch(err => console.error(err));
This seems a bit more simple, doesn’t it?
The async/await version can still be useful if you have some long running synchronous logic in your iteratee and another long-running async task.
This way you can start calculating as soon as you have the first value - you don't have to wait for all the Promises to be resolved to run your computations. Even though the results will still be wrapped in Promises, those are resolved a lot faster then if you did it the sequential way.
What about filter? Something is clearly wrong...
Well, you guessed it: even though the returned values are [ false, true, false, true ], they will be wrapped in promises, which are truthy, so you'll get back all the values from the original array. Unfortunately, all you can do to fix this is to resolve all the values and then filter them.
Reducing is pretty straightforward. Bear in mind though that you need to wrap the initial value into Promise.resolve, as the returned accumulator will be wrapped as well and has to be await-ed.
.. As it is pretty clearly intended to be used for imperative code styles.
To make your .then chains more "pure" looking, you can use Ramda's pipeP and composeP functions.
Rewriting callback-based Node.js applications
Async functions return a Promise by default, so you can rewrite any callback based function to use Promises, then await their resolution. You can use the util.promisify function in Node.js to turn callback-based functions to return a Promise-based ones.
Rewriting Promise-based applications
Simple .then chains can be upgraded in a pretty straightforward way, so you can move to using async/await right away.
If you liked the good old concepts of if-else conditionals and for/while loops,
if you believe that a try-catch block is the way errors are meant to be handled,
you will have a great time rewriting your services using async/await.
As we have seen, it can make several patterns a lot easier to code and read, so it is definitely more suitable in several cases than Promise.then() chains. However, if you are caught up in the functional programming craze of the past years, you might wanna pass on this language feature.
Are you already using async/await in production, or you plan on never touching it? Let's discuss it in the comments below.
This article was originally written by Tamas Kadlecsik and was released on 2017 July 5. The heavily revised second edition was authored by Janos Kubisch and Tamas Kadlecsik, and it was released on 2020 February 17.
Fri Feb 14 2020 16:38:22 GMT+0700 (Western Indonesia Time)
Today Delphi is going to be 25 years old!
Old? Really! My son is one year older and I still would rate him young. I for myself can remember the years between 25 and 30 as some of the best years in my life. It took almost 10 more years until my first encounter with Delphi, soon after its first release. (Now you can estimate my age )
At that time I had been working with Turbo Pascal for a couple of years, starting with TP 2, and I was able to make a decent living as an independent developer. While still investigating the usefulness of Turbo Pascal for Windows, the sudden availability of Delphi was a massive game changer.
Some years ago I was asked to port a long grown Delphi 5 application to the then current Delphi version. The developer in charge didn’t have the capacity to do that, so they looked for external help and, well, I got the gig. After the port was finished I am still occasionally working on that project when they need some help.
Once I became aware that the customer was planning to create a complete new version of that software written in C#. I was a bit miffed as they didn’t even bother to ask me doing that in Delphi. So I just asked if I may at least make an offer.
They were pretty skeptic about a Delphi solution:
But we don’t want the Windows look. We rather have some individual look, matching our corporate identity.
No problem. We can use a style made just for you.
But it has to work on a touch screen.
Delphi supports that out of the box.
But we need a mobile version, too.
So, what?
(some more objections – easily overruled)
They handed me some drafts of the different screens, so I could see what they were after. In a few days I was able to create a prototype with Delphi, that not only resembles their drafts pretty close, but also showed some meaningful actions when clicking buttons and switching tabs. Some cool controls from TMS helped a lot for the first impression.
Somehow I could figure the cost the other company estimated – a mid six digit number. My offer was about 10 – 20% of that. I also teased with having a working solution for the upcoming exhibition – something unthinkable by others.
Meanwhile the C# endeavor is long forgotten. There is still some skepticism about Delphi, no matter what results we show – seems to be some genetic thing.
In the movie Something’s Gotta Give the great Jack Nicholson describes women between 25 and 30 as when everything fits. Seems there are some great times ahead…
Mon Feb 10 2020 09:50:00 GMT+0700 (Western Indonesia Time)
In this post, we cover what tools and techniques you have at your disposal when handling Node.js asynchronous operations: async.js, promises, and async functions.
After reading this article, you’ll know how to use the latest async tools at your disposal provided by Node.js!
Node.js at Scale is a collection of articles focusing on the needs of companies with bigger Node.js installations and advanced Node developers. Chapters:
If you have not read these articles, I highly recommend them as introductions!
The Problem with Node.js Async
Node.js itself is single-threaded, but some tasks can run in parallel thanks to its asynchronous nature.
But what does running in parallel mean in practice?
Since we program a single-threaded VM, it is essential that we do not block execution by waiting for I/O, but handle operations concurrently with the help of Node.js's event-driven APIs.
Let’s take a look at some fundamental patterns, and learn how we can write resource-efficient, non-blocking code, with the built-in solutions of Node.js.
The Classical Approach - Callbacks
Let's take a look at these simple async operations. They do nothing special, just fire a timer and call a function once the timer finished.
Our higher-order functions can be executed sequentially or in parallel with the basic "pattern" by nesting callbacks - but using this method can lead to an untameable callback-hell.
function runSequentially (callback) {
fastFunction((err, data) => {
if (err) return callback(err)
console.log(data) // results of a
slowFunction((err, data) => {
if (err) return callback(err)
console.log(data) // results of b
// here you can continue running more tasks
})
})
}
To become an efficient Node.js developer, you have to avoid the constantly growing indentation level, produce clean and readable code and be able to handle complex flows.
Let me show you some of the tools we can use to organize our code in a nice and maintainable way!
#1: Using Promises
There have been native promises in javascript since 2014, receiving an important boost in performance in Node.js 8. We will make use of them in our functions to make them non-blocking - without the traditional callbacks. The following example will call the modified version of both our previous functions in such a manner:
function fastFunction () {
return new Promise((resolve, reject) => {
setTimeout(function () {
console.log('Fast function done')
resolve()
}, 100)
})
}
function slowFunction () {
return new Promise((resolve, reject) => {
setTimeout(function () {
console.log('Slow function done')
resolve()
}, 300)
})
}
function asyncRunner () {
return Promise.all([slowFunction(), fastFunction()])
}
Please note that Promise.all will fail as soon as any of the promises inside it fails.
The previous functions have been modified slightly to return promises. Our new function, asyncRunner, will also return a promise, that will resolve when all the contained functions resolve, and this also means that wherever we call our asyncRunner, we'll be able to use the .then and .catch methods to deal with the possible outcomes:
asyncRunner()
.then(([ slowResult, fastResult ]) => {
console.log('All operations resolved successfully')
})
.catch((error) => {
console.error('There has been an error:', error)
})
Since node@12.9.0, there is a method called promise.allSettled, that we can use to get the result of all the passed in promises regardless of rejections. Much like Promise.all, this function expects an array of promises, and returns an array of objects that has a status of “fulfilled” or “rejected”, and either the resolved value or the error that occurred.
function failingFunction() {
return new Promise((resolve, reject) => {
reject(new Error('This operation will surely fail!'))
})
}
function asyncMixedRunner () {
return Promise.allSettled([slowFunction(), failingFunction()])
}
asyncMixedRunner()
.then(([slowResult, failedResult]) => {
console.log(slowResult, failedResult)
})
In previous node versions, where .allSettled is not available, we can implement our own version in just a few lines:
To make sure your tasks run in a specific order - maybe successive functions need the return value of previous ones, or depend on the run of previous functions less directly - which is basically the same as _.flow for functions that return a Promise. As long as it's missing from everyone's favorite utility library, you can easily create a chain from an array of your async functions:
function serial(asyncFunctions) {
return asyncFunctions.reduce(function(functionChain, nextFunction) {
return functionChain.then(
(previousResult) => nextFunction(previousResult)
);
}, Promise.resolve());
}
serial([parameterValidation, dbQuery, serviceCall ])
.then((result) => console.log(`Operation result: ${result}`))
.catch((error) => console.log(`There has been an error: ${error}`))
In case of a failure, this will skip all the remaining promises, and go straight to the error handling branch. You can tweak it some more in case you need the result of all of the promises regardless if they resolved or rejected.
Node also provides a handy utility function called "promisify", that you can use to convert any old function expecting a callback that you just have to use into one that returns a promise. All you need to do is import it in your project:
const promisify = require('util').promisify;
function slowCallbackFunction (done) {
setTimeout(function () {
done()
}, 300)
}
const slowPromise = promisify(slowCallbackFunction);
slowPromise()
.then(() => {
console.log('Slow function resolved')
})
.catch((error) => {
console.error('There has been an error:', error)
})
It's actually not that hard to implement a promisify function of our own, to learn more about how it works. We can even handle additional arguments that our wrapped functions might need!
function homebrewPromisify(originalFunction, originalArgs = []) {
return new Promise((resolve, reject) => {
originalFunction(...originalArgs, (error, result) => {
if (error) return reject(error)
return resolve(result)
})
})
}
We just wrap the original callback-based function in a promise, and then reject or resolve based on the result of the operation.
Easy as that!
For better support of callback based code - legacy code, ~50% of the npm modules - Node also includes a callbackify function, essentially the opposite of promisify, which takes an async function that returns a promise, and returns a function that expects a callback as its single argument.
const callbackify = require('util').callbackify
const callbackSlow = callbackify(slowFunction)
callbackSlow((error, result) => {
if (error) return console.log('Callback function received an error')
return console.log('Callback resolved without errors')
})
#2: Meet Async - aka how to write async code in 2020
We can use another javascript feature since node@7.6 to achieve the same thing: the async and await keywords. They allow you to structure your code in a way that is almost synchronous looking, saving us the .then chaining as well as callbacks:
This is the same async runner we've created before, but it does not require us to wrap our code in .then calls to gain access to the results. For handling errors, we have the option to use try & catch blocks, as presented above, or use the same .catch calls that we've seen previously with promises. This is possible because async-await is an abstraction on top of promises - async functions always return a promise, even if you don't explicitly declare them to do so.
The await keyword can only be used inside functions that have the async tag. This also means that we cannot currently utilize it in the global scope.
Since Node 10, we also have access to the promise.finally method, which allows us to run code regardless of whether the promise resolve or rejected. It can be used to run tasks that we had to call in both the .then and .catch paths previously, saving us some code duplication.
Using all of this in Practice
As we have just learned several tools and tricks to handle async, it is time to do some practice with fundamental control flows to make our code more efficient and clean.
Let’s take an example and write a route handler for our web app, where the request can be resolved after 3 steps: validateParams, dbQuery and serviceCall.
If you'd like to write them without any helper, you'd most probably end up with something like this. Not so nice, right?
// validateParams, dbQuery, serviceCall are higher-order functions
// DONT
function handler (done) {
validateParams((err) => {
if (err) return done(err)
dbQuery((err, dbResults) => {
if (err) return done(err)
serviceCall((err, serviceResults) => {
done(err, { dbResults, serviceResults })
})
})
})
}
Instead of the callback-hell, we can use promises to refactor our code, as we have already learned:
// validateParams, dbQuery, serviceCall are higher-order functions
function handler () {
return validateParams()
.then(dbQuery)
.then(serviceCall)
.then((result) => {
console.log(result)
return result
})
.catch(console.log.bind(console))
}
Let's take it a step further! Rewrite it to use the async and await keywords:
It feels like a "synchronous" code but still doing async operations one after each other.
Essentially, a new callback is injected into the functions, and this is how async knows when a function is finished.
Takeaway rules for Node.js & Async
Fortunately, Node.js eliminates the complexities of writing thread-safe code. You just have to stick to these rules to keep things smooth:
As a rule of thumb, prefer async, because using a non-blocking approach gives superior performance over the synchronous scenario, and the async - await keywords gives you more flexibility in structuring your code. Luckily, most libraries now have promise based APIs, so compatibility is rarely an issue, and can be solved with util.promisify should the need arise.
If you have any questions or suggestions for the article, please let me know in the comments!
This article was originally written by Tamas Hodi, and was released on 2017, January 17. The revised second edition was authored by Janos Kubisch and Tamas Hodi and it was released on 2020 February 10.
Mon Jan 27 2020 08:16:58 GMT+0700 (Western Indonesia Time)
Note: this article was originally published on ProAgile’s blog
I only recently joined ProAgile and I feel we’ve got off to a great start. Last week my colleague Fredrik Wendt and I facilitated and hosted a Code Retreat event for a diverse group of software crafters from local companies.
at the start of the day
It’s the 10th anniversary of the “Global Day of Code Retreat” event and there were over 150 locations around the globe holding one last week. It’s not the first time I’ve facilitated a Code Retreat but it is the first time I’ve done one in Gothenburg, (the others have been in Stockholm). This year Fredrik and I were keen to bring together some local people, and contribute to the community here. ProAgile has recently invested in a fantastic venue for courses and training at our offices, and we want to take full advantage of it.
We contacted several local companies and specifically invited them to advertise on the event sign up page that they were going to send people. We were delighted when Boeing (Jeppesen), Pagero, Meltwater, Spotify and Greenbyte all agreed to this. Their intention to participate I’m sure helped get the attention of other local software crafters when we put out a general invitation with open sign-ups.
In the end we were a very diverse group drawn from many local companies both large and small. We had a game designer who favoured C++, a Scala enthusiast, a Kotlin proponent, a Python trainer, several Javascript developers, a self-taught PHP and Python developer, a CEO who still codes occasionally, and many local Java, Python and C# developers. Everyone got to pair program with people from other language communities and backgrounds.
Fredrik and I decided to hold a standard code retreat event and based our planning on this article: “Structure of a Code Retreat”. We held 5 sessions working on the “Game of Life” Code Kata through the day. In each session, people work in pairs starting from an empty editor, and come up with a new solution to the problem. Between each session you hold a short retrospective with your pairing partner before taking a short break and switching to a different pairing partner.
pair programming
In the morning sessions the focus is on getting to know the problem. We all try to find a good way to use Test-Driven Development and simple design rules to get a clean, understandable, flexible design. The sessions after lunch are about using this Game of Life exercise as a vehicle for trying out something new or otherwise challenging. We had some pairs using unfamiliar programming languages and environments. Some pairs were following strict design rules like ‘no if statements, no loops’ and ‘no function longer than 1 line’. Some people accepted the challenge to work on the problem as a mob; we were 4-6 people using one computer with me facilitating.
mob programming
Throughout the day there were opportunities to reflect on the way we write code: how design guidelines and programming languages and Test-Driven Development and personal preferences all interact to influence the code we end up with. In normal project work with deadlines and tricky business rules and security constraints and so on, you might not get much time to consider the fundamentals of what good software design looks like. Test-Driven Development is a complex skill to learn – it has many facets. I think all programmers benefit from taking some time occasionally to work on practice exercises and discuss software design principles with peers.
At the end of the day we reflected all together in a closing circle. Everyone had the opportunity to say a few words to the group about what they were taking away with them. When you’ve spent time working on a Code Kata, I think there is a complexity gap you need to bridge – you want to carry over the principles and skills you gained from that simple exercise to your actual production code situation. It’s useful to think about what you’ve learnt and explain how you want to apply it later.
In the closing circle, I was happy to hear several positive comments about Test-Driven Development and an intention to use it more. Some people had seen a new programming language and had ideas about when it could be useful to them. Several people mentioned they appreciated the chance to program with people outside of their company and comfort zone. It was a good day, and I don’t think it will be the last such event we hold in Gothenburg.
If you’d like to know about the next events hosted by ProAgile, take a look at our course calendar, keep an eye on ProAgile’s social media channels and perhaps join one of our networking groups.
Mon Jan 20 2020 14:55:05 GMT+0700 (Western Indonesia Time)
In this article, I’m going to show how you can quickly generate a static site with Hugo and Netlify in an easy way.
What are static site generators, and why do you need one?
Simply put, a static site generator takes your content, applies it to a template, and generates an HTML based static site. It’s excellent for blogs and landing pages.
Benefits:
Quick deployment
Secure (no dynamic content)
Fast load times
Simple usage
Version control
So, what are the popular options in terms of static site generators?
Gatsby (React/JS)
Hugo (Go)
Next.js (React/JS)
Jekyll (Ruby)
Gridsome (Vue/JS)
These are the most starred projects on GitHub. I've read about Hugo previously, and it seemed fun to try out, so I’m going to stick with Hugo.
What is Hugo?
The official website states that Hugo is the world's fastest static website engine.
We can confirm that it’s really fast. Hugo is written in Golang. It also comes with a rich theming system and aims to make building websites fun again.
Let’s see what we got here.
Installing Hugo
Mac:
brew install hugo
Linux:
sudo apt-get install hugo
or
sudo pacman -Syu hugo
To verify your install:
hugo version
Using Hugo
Create a new project:
hugo new site my-project
Add a theme for a quick start. You can find themes here.
cd my-project
git init
git submodule add https://github.com/budparr/gohugo-theme-ananke.git themes/ananke
Add the theme to the config file.
echo 'theme = "ananke"' >> config.toml
Add some content.
hugo new posts/my-first-post.md
It should look something like this:
---
title: "My First Post"
date: 2020-01-05T18:37:11+01:00
draft: true
---
Hello World!
There are lots of options (tags, description, categories, author) you can write to the front matter details.
.
├── archetypes
├── assets (not created by default)
├── config.toml
├── content
├── data
├── layouts
├── static
└── themes
archetypes: Archetypes are content template files that contain preconfigured front matter (date, title, draft). You can create new archetypes with custom preconfigured front matter fields.
assets: Assets folder stores all the files, which are processed by Hugo Pipes. (e.g. CSS/Sass files) This directory is not created by default.
config.toml: Hugo uses the config.toml, config.yaml, or config.json (if found in the site root) as the default site config file. Instead of a single config file, you can use a config directory as well to separate different environments..
content: This is where all the content files live. Top level folders count as content sections. If you have devops and nodejs sections, then you will have content/devops/first-post.md and content/nodejs/second-post.md directories.
data: This directory is used to store configuration files that can be used by Hugo when generating your website.
layouts: Stores templates in the form of .html files. See the Styling section for more information.
static: Stores all the static content: images, CSS, JavaScript, etc. When Hugo builds your site, all assets inside your static directory are copied over as-is.
themes: Hugo theme of your choice.
Styling our static site
Remember, we applied a theme before. Now, if we inspect the themes folder, we can see the styling files.
But beware!
DO NOT EDIT THESE FILES DIRECTLY.
Instead, we will mirror the theme directory structure to the root layouts folder.
Let's say I want to apply custom CSS to the theme.
The theme has a themes/theme-name/layouts/partials folder, where we can find some HTML templates (header.html, footer.html). Now we will edit the header.html template, so copy the content from this file to layouts/partials/header.html and be careful to create the same directory structure like the theme's into the root layouts folder.
Create a custom CSS file: static/css/custom-style.css.
Add the custom css file to config.toml:
[params]
custom_css = ["css/custom-style.css"]
Open layouts/partials/header.html:
Add this code inside the <head> tag:
{{ range .Site.Params.custom_css -}}
<link rel="stylesheet" href="{{ . | absURL }}">
{{- end }}
Now you can overwrite CSS classes applied by your theme.
Deploying our static site to Netlify
One of the benefits of a static site is that you can deploy it easily. Netlify or AWS S3 is a very good choice for hosting a static site. Let’s see how to deploy it to Netlify.
Requirements:
Netlify account
Github repository
What to do on Netlify
Create a git repository
Create a netlify.toml file into the root of your project with the content below.
Thu Jan 09 2020 15:53:22 GMT+0700 (Western Indonesia Time)
Hello there, and Happy 2020!
At RisingStack, besides working on consulting and outsourced development projects, we're actively training engineering teams as well, ranging in size from 5 to 25 ppl at a time.
You might already know that we have 2-days-long training agendas for
These training opportunities are regularly popping up in major European cities, and are also available for companies who'd like to train their engineers on-site, wherever that may be.
In December we prepared a new, 5-days-long training agenda for engineering teams who'd like to dive deep into React and Node, but have little to none experience with these technologies.
Below you can read the full training agenda for the React training, and you can also check out the 5-days-long Node.js Training Agenda in another blogpost.
In case you have any questions about our training agendas, or if you'd like to invite us, reach out to me at ferenc.hamori@risingstack.com, or use the contact form on our training page.
I'll get back to you within 24 hrs.
This React Training is for developers who:
want to improve their front-end skills,
want to build application prototypes rapidly,
want to create complex and maintainable websites with React
The goal of the training sessions is to
teach JavaScript and React fundamentals.
teach how to create complex and maintainable websites with React.
teach how to write performant front-end code with React, with the latest UX best-practices in mind.
Prerequisites
Basic JavaScript and HTML knowledge needed.
No prior React knowledge is required.
Other info
This training agenda is delivered throughout 5 days.
The training relies heavily on hands-on exercises. During the training, we're building a social networking site.
Full Training Agenda
React primer
Setting up a React project
JSX and rendering
Creating React components
Handling state
Project design and structuring
Performance optimization
The new way of writing React: Hooks
Revising and covering more exotic use cases
Complex state management with third-party libraries
Networking on the client-side
Routing with User Experience in mind
Creating a real-world React app
1. React primer
We will discuss the basics of front-end applications, then learn what React is and when to use it. After that, you will learn the core principles behind React - like components and the vDOM.
Vanilla JS vs. jQuery vs. Modern Frontend Frameworks
When to use React
Components and their benefits
Introducing the virtual DOM
React vs. other frameworks: the difference between a view layer and full frameworks
The current state and the future of React: async rendering and hooks vs. lifecycle
2. Setting up a React project
You will learn how to bootstrap a React application in seconds with create-react-app and jump straight into development. We will cover the basics of writing components and the development flow.
1-minute setup with create-react-app
Writing our first dummy app
Introducing the basic programming and dev tools
Creating our first production build
What happens behind the scenes of create-react-app?
3. JSX and rendering
You will learn what JSX is and its relation to HTML and JavaScript. After that, we will discuss when do React components render and what exactly happens during a render.
The relation of JSX to JS and HTML
Common JS syntax patterns that you will use inside JSX: like conditional rendering and spreading
Inspecting how renders affect the DOM
The syntactical differences between JSX and HTML
What are JSX fragments
What happens with JSX during the build
4. Creating React components
We will take a deeper dive into React components - explaining the different ways of writing them. After that, we will learn how to handle user-triggered and lifecycle events.
Class-based and function components
Event handling
Synthetic React events vs. DOM events
Lifecycle events
5. Handling state
We will learn how to handle local state inside components, how to split complex apps into multiple components, and how to share state with child components.
Handling local state
Controlled components and uncontrolled components
Passing props to child components
Lifting the state up: when and how to do it
The problems with props and handling state in big apps with React context
6. Project design and structuring
We will discuss best practices for project structuring and component design. We will learn the difference between stateful and stateless components and the difference between container & presentational components.
Project structuring
Stateful and stateless components
Containers and presentational components
7. Performance optimization
React has a few key concepts which boost performance significantly. Knowing these and applying them during development can save you from a lot of post-project optimization headache.
Avoiding redundant renders with PureComponent, shouldComponentUpdate and memo
Using keys to render lists: why are keys required and what do they do
Common design mistakes that slow down websites
8. The new way of writing React: Hooks
Hooks are the new way of writing React logic. They are co-existing with lifecycle events, but they fundamentally differ from them. We will discuss the benefits and drawbacks of both and your opinion about them.
From mixins to lifecycles to hooks: the benefit of hooks and why were they added
Writing an app with the most commonly used React hooks
The rules of hooks and what happens if you violate them
Writing a simple useWindowSize hook
How hooks work behind the scenes
Your opinion about hooks vs. old-school lifecycles
9. Revising and covering more exotic use cases
React has an amazingly well written and terse documentation. We will go through the docs, discuss what we already know, and learn what we did not cover so far.
Avoiding redundant renders with PureComponent, shouldComponentUpdate, and memo
Using keys to render lists: why are keys required and what do they do
Common design mistakes that slow down websites
10. Complex state management with third-party libraries
We will discuss when to use React’s own setState and when to use more third-party state management solutions, then learn how to manage complex state and handle async state changes.
Why is React’s own setState not enough: handling large scale global state
Learning the basics of Redux
Writing an app with redux and react-redux
Handling async actions
The idea behind and redux and it’s benefits
Covering other - fundamentally different - state management alternatives: like MobX and Apollo Link State
11. Networking on the client-side
You will learn how to fetch data from an API server and how to handle async events.
Handling async networking
Updating the state
A quick glance at GraphQL and when to use it
12.Routing with User Experience in mind
You will learn how to implement user-friendly routing with pages and links, then we’ll move on to programmatic routing. We will also cover protected routes with redirects and handling query parameters.
Introducing React Router
Creating a simple multi-page app with links
Handling redirects and private pages
Nested routing
Keeping the minimal state in query parameters
13. Creating a real-world React app
You will learn how to rapidly develop and deploy front-end apps while keeping them maintainable.
Rapid app bootstrapping and development
UX considerations, project management, and structuring
Mon Nov 25 2019 13:41:15 GMT+0700 (Western Indonesia Time)
Seems Delphi 10.3.3 Rio adds some bogus entries for Android 64 into the dproj files when opening a project from a previous version. As this undermines the normalizing algorithm in Project Magician I added some code to clean up that mess first.
Thu Nov 21 2019 13:55:33 GMT+0700 (Western Indonesia Time)
With the official release of Delphi 10.3.3 Rio comes a new version of Project Magician. This was necessary to support the new platforms introduced in the latest Rio updates.
I also took the opportunity to add some small bug fixes and enhancements.